Mysql 資料庫常用備份方法和注意事項_Mysql
來源:互聯網
上載者:User
MysqlDatabase Backup的常用3種方法:
1、直接拷貝(cp、tar,gzip,cpio)
2、mysqldump
3、mysqlhotcopy
1.使用直接拷貝Database Backup
典型的如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
# 得到Database Backup列表,在此可以過濾不想備份的資料庫
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 複製所有資料庫名匹配給出的Regex的資料庫。
· --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)。