程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Mysql 數據庫常用備份方法和注意事項

Mysql 數據庫常用備份方法和注意事項

編輯:關於MYSQL數據庫
Mysql數據庫備份的常用3種方法:
1、直接拷貝(cp、tar,gzip,cpio)
2、mysqldump
3、mysqlhotcopy

1.使用直接拷貝數據庫備份
典型的如cp、tar或cpio實用程序。
當你使用直接備份方法時,必須保證表不在被使用。如果服務器在你正在拷貝一個表時改變它,拷貝就失去意義。
保證你的拷貝完整性的最好方法是關閉服務器,拷貝文件,然後重啟服務器。如果你不想關閉服務器,要在執行表檢查的同時鎖定服務器。如果服務器在運行,相同的制約也適用於拷貝文件,而且你應該使用相同的鎖定協議讓服務器“安靜下來”。
當你完成了備份時,需要重啟服務器(如果關閉了它)或釋放加在表上的鎖定(如果你讓服務器運行)。
要用直接拷貝文件把一個數據庫從一台機器拷貝到另一台機器上,只是將文件拷貝到另一台服務器主機的適當數據目錄下即可。要確保文件是MyIASM格式或兩台機器有相同的硬件結構,否則你的數據庫在另一台主機上有奇怪的內容。你也應該保證在另一台機器上的服務器在你正在安裝數據庫表時不訪問它們。
2.mysqldump
基本語法:
Shell> mysqldump [OPTIONS] database [tables] > data_backup.sql (不指定數據庫名表示全部備份)
例如:
mysqldump -uroot -p --default-character-set=cp932 --opt --extended-insert=false --hex-blob -R -x mysql > E:\mysql.sql
輸出文件的開頭看起來象這樣:
# MySQL Dump 6.0
#
# Host: localhost Database: samp_db
#---------------------------------------
# Server version 3.23.2-alpha-log
#
# Table structure for table 'absence'
#
CREATE TABLE absence(
student_id int(10) unsigned DEFAULT '0' NOT NULL,
date date DEFAULT '0000-00-00' NOT NULL,
PRIMARY KEY (student_id,date)
);
#
# Dumping data for table 'absence'
#
INSERT INTO absence VALUES (3,'1999-09-03');
INSERT INTO absence VALUES (5,'1999-09-03');
INSERT INTO absence VALUES (10,'1999-09-08');
...... 
文件剩下的部分有更多的INSERT和CREATE TABLE語句組成。例:
%mysqldump samp_db >/opt/mysqldatabak/samp_db.2006-5-15
%mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz #產生壓縮備份
%mysqldump samp_db student score event absence >grapbook.sql #備份數據庫的某些表
%mysqladmin -h boa.snake.net create samp_db
%mysqldump samp_db | mysql -h boa.snake.net samp_db #直接恢復到另一個服務器上使用--add-drop-table選項告訴服務器將DROP TABLE IF EXISTS語句寫入備份文件,這樣當我們以後用來恢復數據庫時,如果表已經存在,你不會得到一個錯誤。
%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db
mysqldump其它有用的選項包括:
--flush-logs和--lock-tables組合將對你的數據庫檢查點有幫助。--lock-tables鎖定你正在傾倒的所有表,而--flush-logs關閉並重新打開更新日志文件,新的更新日志將只包括從備份點起的修改數據庫的查詢。這將設置你的更新日志檢查點位備份時間。(然而如果你有需要執行個更新的客戶,鎖定所有表對備份期間的客戶訪問不是件好事。)
如果你使用--flush-logs設置檢查點到備份時,有可能最好是傾倒整個數據庫。如果你傾倒單獨的文件,較難將更新日志檢查點與備份文件同步。在恢復期間,你通常按數據庫為基礎提取更新日志內容,對單個表沒有提取更新的選擇,所以你必須自己提取它們。
缺省地,mysqldump在寫入前將一個表的整個內容讀進內存。這通常確實不必要,並且實際上如果你有一個大表,幾乎是失敗的。你可用--quick選項告訴mysqldump只要它檢索出一行就寫出每一行。為了進一步優化傾倒過程,使用--opt而不是--quick。--opt選項打開其它選項,加速數據的傾倒和把它們讀回。
用--opt實施備份可能是最常用的方法,因為備份速度上的優勢。然而,要警告你,--opt選項確實有代價,--opt優化的是你的備份過程,不是其他客戶對數據庫的訪問。--opt選項通過一次鎖定所有表阻止任何人更新你正在傾倒的任何表。你可在一般數據庫訪問上很容易看到其效果。
一個具有--opt的相反效果的選項是--dedayed。該選項使得mysqldump寫出INSERT DELAYED語句而不是INSERT語句。如果你將數據文件裝入另一個數據庫並且你想使這個操作對可能出現在該數據庫中的查詢的影響最小,--delayed對此很有幫助。
--compress選項在你拷貝數據庫到另一台機器上時很有幫助,因為它減少網絡傳輸字節的數量。下面有一個例子,注意到--compress對與遠端主機上的服務器通信的程序才給出,而不是對與本地主機連接的程序:
%mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db
mysqldump有很多其它選項,主要參數:
--compatible=name
它告訴 mysqldump,導出的數據將和哪種數據庫或哪個舊版本的 MySQL 服務器相兼容。值可以為 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用幾個值,用逗號將它們隔開。當然了,它並不保證能完全兼容,而是盡量兼容。
--complete-insert,-c
導出的數據采用包含字段名的完整 INSERT 方式,也就是把所有的值都寫在一行。這麼做能提高插入效率,但是可能會受到 max_allowed_packet 參數的影響而導致插入失敗。因此,需要謹慎使用該參數,至少我不推薦。
--extended-insert = true|false
默認情況下,mysqldump 開啟 --complete-insert 模式,因此不想用它的的話,就使用本選項,設定它的值為 false 即可。
--default-character-set=charset
指定導出數據時采用何種字符集,如果數據表不是采用默認的 latin1 字符集的話,那麼導出時必須指定該選項,否則再次導入數據後將產生亂碼問題。
--disable-keys
告訴 mysqldump 在 INSERT 語句的開頭和結尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 語句,這能大大提高插入語句的速度,因為它是在插入完所有數據後才重建索引的。該選項只適合 MyISAM 表。
--hex-blob
使用十六進制格式導出二進制字符串字段。如果有二進制數據就必須使用本選項。影響到的字段類型有 BINARY、VARBINARY、BLOB。
--lock-all-tables,-x
在開始導出之前,提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉 --single-transaction 和 --lock-tables 選項。
--lock-tables
它和 --lock-all-tables 類似,不過是鎖定當前導出的數據表,而不是一下子鎖定全部庫下的表。本選項只適用於 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 選項。
--no-create-info,-t
只導出數據,而不添加 CREATE TABLE 語句。
--no-data,-d
不導出任何數據,只導出數據庫表結構。
--opt
這只是一個快捷選項,等同於同時添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓 mysqldump 很快的導出數據,並且導出的數據能很快導回。該選項默認開啟,但可以用 --skip-opt 禁用。注意,如果運行 mysqldump 沒有指定 --quick 或 --opt 選項,則會將整個結果集放在內存中。如果導出大數據庫的話可能會出現問題。
--quick,-q
該選項在導出大表時很有用,它強制 mysqldump 從服務器查詢取得記錄直接輸出而不是取得所有記錄後將它們緩存到內存中。
--routines,-R
導出存儲過程以及自定義函數。
--single-transaction
該選項在導出數據之前提交一個 BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於事務表,例如 InnoDB 和 BDB。
本選項和 --lock-tables 選項是互斥的,因為 LOCK TABLES 會使任何掛起的事務隱含提交。
要想導出大表的話,應結合使用 --quick 選項。
--triggers
同時導出觸發器。該選項默認啟用,用 --skip-triggers 禁用它。
3.mysqlhotcopy備份
mysqlhotcopy是一個Perl腳本,最初由Tim Bunce編寫並提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫。它是備份數據庫或單個表的最快的途徑,但它只能運行在數據庫目錄所在的機器上。mysqlhotcopy只用於備份MyISAM。它運行在Unix和NetWare中
使用方法見下面的腳本.加入crotab中吧.
#!/bin/sh
# Name:mysqlbackup.sh
# PS:MySQL DataBase Backup,Use mysqlhotcopy script.
# Last Modify:2008-06-12
# 定義變量,請根據具體情況修改
# 定義腳本所在目錄
scriptsDir=`pwd`
# 數據庫的數據目錄
dataDir=/var/lib/mysql
# 數據備份目錄
tmpBackupDir=/tmp/mysqlblackup
backupDir=/backup/mysql
# 用來備份數據庫的用戶名和密碼
mysqlUser=root
mysqlPWD='you password'
# 如果臨時備份目錄存在,清空它,如果不存在則創建它
if [[ -e $tmpBackupDir ]]; then
rm -rf $tmpBackupDir/*
else
mkdir $tmpBackupDir
fi
# 如果備份目錄不存在則創建它
if [[ ! -e $backupDir ]];then
mkdir $backupDir
fi
# 得到數據庫備份列表,在此可以過濾不想備份的數據庫
for databases in `find $dataDir -type d | \
sed -e "s/\/var\/lib\/mysql\///" | \
sed -e "s/test//"`; do
if [[ $databases == "" ]]; then
continue
else
# 備份數據庫
/usr/bin/mysqlhotcopy --user=$mysqlUser --password=$mysqlPWD -q "$databases" $tmpBackupDir
dateTime=`date "+%Y.%m.%d %H:%M:%S"`
echo "$dateTime Database:$databases backup success!" >>MySQLBackup.log
fi
done
# 壓縮備份文件
date=`date -I`
cd $tmpBackupDir
tar czf $backupDir/mysql-$date.tar.gz ./
#End完成
加入到crontab中設置每周5運行
0 0 * * 5 /backup/blackup.sh
注意:恢復數據庫到備份時的狀態
mysqlhotcopy 備份出來的是整個數據庫目錄,使用時可以直接拷貝到 mysqld 指定的 datadir (在這裡是 /var/lib/mysql/)目錄下即可,同時要注意權限的問題,如下例:
shell> cp -rf db_name /var/lib/mysql/
shell> chown -R mysql:mysql /var/lib/mysql/ (將 db_name 目錄的屬主改成 mysqld 運行用戶)
本套備份策略只能恢復數據庫到最後一次備份時的狀態,要想在崩潰時丟失的數據盡量少應該更頻繁的進行備份,要想恢復數據到崩潰時的狀態請使用主從復制機制(replication)。
小技巧:
不想寫密碼在shell中的話,可以在root的home目錄下建立一個.my.cnf文件,以便讓mysqlhotcopy從中讀取用戶名/密碼。
[mysqlhotcopy]
user=root
password=YourPassword
然後安全起見,chmod一下。
chmod 600 ~/.my.cnf
附:mysqlhotcopy常用參數:
· --allowold 如果目標存在不放棄(加上一個_old後綴重新命名它)。
· --checkpoint=db_name.tbl_name 在指定的db_name.tbl_name插入檢查點條目。
· ---debug 啟用調試輸出。
· --dryrun,-n 報告動作而不執行它們。
· --flushlog 所有表鎖定後刷新日志。
· --keepold 完成後不刪除以前(重新命名的)的目標。
· -- method=command 復制方法(cp或scp)。
· --noindices 備份中不包括全部索引文件。這樣使備份更小、更快。可以在以後用myisamchk -rq重新構建索引。
· --password=password,-p password 當連接服務器時使用的密碼。請注意該選項的密碼值是不可選的,不象其它MySQL程序。
· --port=port_num,-P port_num 當連接本地服務器時使用的TCP/IP端口號。
· --quiet,-q 除了出現錯誤時保持沉默。
· --regexp=expr 復制所有數據庫名匹配給出的正則表達式的數據庫。
· --socket=path,-S path 用於連接的Unix套接字文件。
· --suffix=str 所復制的數據庫名的後綴。
· --tmpdir=path 臨時目錄(代替/tmp)。
· --user=user_name,-u user_name 當連接服務器時使用的MySQL用戶名。
mysqlhotcopy從選項文件讀取[client]和[mysqlhotcopy]選項組。要想執行mysqlhotcopy,你必須可以訪問備份的表文件,具有那些表的SELECT權限和RELOAD權限(以便能夠執行FLUSH TABLES)。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved