MySQL入門篇(六)之mysqldump備份和恢復
-
一、備份單個數據庫
1、備份命令:mysqldump
MySQL數據庫自帶的一個很好用的備份命令。是邏輯備份,導出 的是SQL語句。也就是把數據從MySQL庫中以邏輯的SQL語句的形式直接輸出或生成備份的文件的過程。
單實例語法(Syntax): mysqldump -u <username> -p <dbname> > /path/to/***.sql 多實例的備份語法(Syntax): mysqldump -u <username> -p <dbname> -S <sockPath> > /path/to/***.sql
eg: mysqldump -u root -p wordpress > /opt/wordpress_$(date +%F).sql
2、參數解析
1 -A --all-databases:導出全部數據庫 2 -Y --all-tablespaces:導出全部表空間 3 -y --no-tablespaces:不導出任何表空間信息 4 --add-drop-database每個數據庫創建之前添加drop數據庫語句。 5 --add-drop-table每個數據表創建之前添加drop數據表語句。(默認為打開狀態,使用--skip-add-drop-table取消選項) 6 --add-locks在每個表導出之前增加LOCK TABLES並且之后UNLOCK TABLE。(默認為打開狀態,使用--skip-add-locks取消選項) 7 --comments附加注釋信息。默認為打開,可以用--skip-comments取消 8 --compact導出更少的輸出信息(用於調試)。去掉注釋和頭尾等結構。可以使用選項:--skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys 9 -c --complete-insert:使用完整的insert語句(包含列名稱)。這么做能提高插入效率,但是可能會受到max_allowed_packet參數的影響而導致插入失敗。 10 -C --compress:在客戶端和服務器之間啟用壓縮傳遞所有信息 11 -B--databases:導出幾個數據庫。參數后面所有名字參量都被看作數據庫名。 12 --debug輸出debug信息,用於調試。默認值為:d:t:o,/tmp/ 13 --debug-info輸出調試信息並退出 14 --default-character-set設置默認字符集,默認值為utf8 15 --delayed-insert采用延時插入方式(INSERT DELAYED)導出數據 16 -E--events:導出事件。 17 --master-data:在備份文件中寫入備份時的binlog文件,在恢復進,增量數據從這個文件之后的日志開始恢復。值為1時,binlog文件名和位置沒有注釋,為2時,則在備份文件中將binlog的文件名和位置進行注釋 18 --flush-logs開始導出之前刷新日志。請注意:假如一次導出多個數據庫(使用選項--databases或者--all-databases),將會逐個數據庫刷新日志。除使用--lock-all-tables或者--master-data外。在這種情況下,日志將會被刷新一次,相應的所以表同時被鎖定。因此,如果打算同時導出和刷新日志應該使用--lock-all-tables 或者--master-data 和--flush-logs。 19 --flush-privileges在導出mysql數據庫之后,發出一條FLUSH PRIVILEGES 語句。為了正確恢復,該選項應該用於導出mysql數據庫和依賴mysql數據庫數據的任何時候。 20 --force在導出過程中忽略出現的SQL錯誤。 21 -h --host:需要導出的主機信息 22 --ignore-table不導出指定表。指定忽略多個表時,需要重復多次,每次一個表。每個表必須同時指定數據庫和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 …… 23 -x --lock-all-tables:提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉--single-transaction 和--lock-tables 選項。 24 -l --lock-tables:開始導出前,鎖定所有表。用READ LOCAL鎖定表以允許MyISAM表並行插入。對於支持事務的表例如InnoDB和BDB,--single-transaction是一個更好的選擇,因為它根本不需要鎖定表。請注意當導出多個數據庫時,--lock-tables分別為每個數據庫鎖定表。因此,該選項不能保證導出文件中的表在數據庫之間的邏輯一致性。不同數據庫表的導出狀態可以完全不同。 25 --single-transaction:適合innodb事務數據庫的備份。保證備份的一致性,原理是設定本次會話的隔離級別為Repeatable read,來保證本次會話(也就是dump)時,不會看到其它會話已經提交了的數據。 26 -F:刷新binlog,如果binlog打開了,-F參數會在備份時自動刷新binlog進行切換。 27 -n --no-create-db:只導出數據,而不添加CREATE DATABASE 語句。 28 -t --no-create-info:只導出數據,而不添加CREATE TABLE 語句。 29 -d --no-data:不導出任何數據,只導出數據庫表結構。 30 -p --password:連接數據庫密碼 31 -P --port:連接數據庫端口號 32 -u --user:指定連接的用戶名。
舉例使用:
a、導出整個數據庫(包括數據庫中的數據) mysqldump -u username -p dbname > dbname.sql b、導出數據庫結構(不含數據) mysqldump -u username -p -d dbname > dbname.sql c、導出數據庫中的某張數據表(包含數據) mysqldump -u username -p dbname tablename > tablename.sql d、導出數據庫中的某張數據表的表結構(不含數據) mysqldump -u username -p -d dbname tablename > tablename.sql
3、恢復操作
語法(Syntax): mysql -u<username> -p<password> <dbname> < /opt/mytest_bak.sql #庫必須保留,空庫也可 說明:指定dbname,相當於use <dbname>
4、示例
(1)無參數備份數據庫mytest和恢復
(1)備份操作 a、備份 mysqldump -uroot -p‘123456’ mytest > /mnt/mytest_bak_$(date +%F).sql
(2)恢復操作 a、刪除student表(庫必須要保留,空庫都行) mysql -uroot -p'123456' -e "use mytest;drop table student;" b、恢復數據 mysql -uroot -p'123456' mytest < /mnt/mytest_bak.sql c、查看數據 mysql -uroot -p'123456' -e "select * from mytest.student;"
(2)-B參數備份和恢復(建議使用)
(1)備份操作 a、備份 mysqldump -uroot -p'123456' -B mytest > /mnt/mytest_bak_B.sql 說明:加了-B參數后,備份文件中多的Create database和use mytest的命令 加-B參數的好處: 加上-B參數后,導出的數據文件中已存在創建庫和使用庫的語句,不需要手動在原庫是創建庫的操作,在恢復過程中不需要手動建庫,可以直接還原恢復。 (2)恢復操作 a、刪除mytest庫 mysql -uroot -p'123456' -e "drop database mytest;" b、恢復數據 (1)使用不帶參數的導出文件導入(導入時不指定要恢復的數據庫),報錯 mysql -uroot - p'123456' < /mnt/mytest_bak.sql ERROR 1046 (3D000) at line 22: No database selected (2)使用帶-B參數的導出文件導入(導入時也不指定要恢復的數據庫),成功 mysql -uroot -p'123456' < /mnt/mytest_bak_B.sql c、查看數據 mysql -uroot -p'123456' -e "select * from mytest.student;"
(3)--compact參數優化備份文小大小,減少輸出注釋(一般用於Debug調試)
(1)備份 mysqldump -uroot -p'123456' --compact -B mytest > /mnt/mytest_bak_Compact.sql 說明: 使用--compact參數,可以優化輸出內容的大小,讓容量更少,適合調試。便會忽略--skip-add-drop-table,--no-set-names,--skip-disable-keys,--skip-add-locks等幾個參數的功能。
(4)指定壓縮命令來壓縮備份文件
(1)備份 mysqldump -uroot -p'123456' -B mytest | gzip > /mnt/mytest_bak_.sql.gz 說明: mysqldump導出的文件是文本文件,壓縮效率很高
(5)備份多個數據庫
(1)說明 通過-B參數指定相關數據庫,每個數據庫名之前用空格分格。當使用-B參數后,將所有數據庫全部列全,則此時等同於-A參數。 (2)備份 mysqldump -uroot -p'123456' -B mytest wiki | gzip > /mnt/mytestAndWiki_bak.sql.gz
(6)分庫備份
分庫備份實際上就是執行一個備份語句就備份一個庫,有多個庫時,就執行多條相同的備份語句,只是備份的庫名和備份文件名不同而已。可能通過shell腳本自動生成並執行相應的操作,也可以把所有單個備份語句寫在一個shell腳本中,通過cron定時任務來備份。
分庫備份的意義是在所有庫都備份成一個備份文件時,恢復其中一個庫的數據是比較麻煩的,所以分庫備份,利於恢復。分庫備份腳本如下:
for dbname in ` mysql -uroot -p'123456' -e "show databases;" | grep -Evi "database|infor|perfor"` do mysqldump -uroot -p"123456" --events -B $dbname | gzip > /mnt/${dbname}_bak.sql.gz done
說明:${dbname}_bak,由於要求備份文件名以$dbname_bak.sql.gz格式命令,但系統無法辨別變量是$dbname還是$dbname_bak,所以此時就需要用大括號“{}”將變量括起來,就是${dbname}_bak.sql.gz了。
(7)-d參數,只備份數據庫中表結構
mysqldump -uroot -p'123456' -d mytest > /mnt/mytestDesc_bak.sql
(8)-A參數備份全庫,並且-F刷新和切換binlog
mysqldump -uroot -p'123456' -A -B -F > /mnt/All_bak.sql
(9)--master-data參數在備份文件中寫入當前binlog文件號
mysqldump -uroot -p'123456' --master-data=1 --compact mytest > /mnt/All_bak.sql mysqldump -uroot -p'123456' --master-data=2 --compact mytest > /mnt/All_bak.sql
-
二、備份單個表
語法(Syntax):不能加-B參數 mysqldump -u<username> -p<password> dbname tablename1 tablename2... > /path/to/***.sql
示例:
示例1:備份mytest庫中的student表 mysqldump -uroot -p'123456' mytest student > /mnt/table_bak/student_bak.sql 示例2:備份mytest庫中所有表,就是備份mytest庫 mysqldump -uroot -p'123456' mytest > /mnt/table_bak/all_bak.sql 示例3:備份mytest庫中的student和test表 mysqldump -uroot -p'123456' mytest student test > /mnt/table_bak/two_bak.sql 示例4:-d參數,只備份表結構 mysqldump -uroot -p'123456' -d mytest stusent > /mnt/studentDesc_bak.sql 示例5:-t參數,只備份數據 mysqldump -uroot -p'123456' --compact -t mytest stusent > /mnt/studentData_bak.sql INSERT INTO `student` VALUES (1,'Tom',20,'S11'),(2,'Jary',21,'S12'),(3,'King',25,'S10'),(4,'Smith',19,'S11'),(5,'??',20,'S11'),(6,'張三',20,'S11');
-
三、企業生產場景不同引擎備份命令參數
1、mysqldump的關鍵參數
-B:指定多個庫,在備份文件中增加建庫語句和use語句 --compact:去掉備份文件中的注釋,適合調試,生產場景不用 -A:備份所有庫 -F:刷新binlog日志 --master-data:在備份文件中增加binlog日志文件名及對應的位置點 -x --lock-all-tables:鎖表 -l:只讀鎖表 -d:只備份表結構 -t:只備份數據 --single-transaction:適合innodb事務數據庫的備份 InnoDB表在備份時,通常啟用選項--single-transaction來保證備份的一致性,原理是設定本次會話的隔離級別為Repeatable read,來保證本次會話(也就是dump)時,不會看到其它會話已經提交了的數據。
2、不同引擎備份命令參數用法
1)Myisam引擎: mysqldump -uroot -p123456 -A -B --master-data=1 -x| gzip > /data/all_$(date +%F).sql.gz (2)InnoDB引擎: mysqldump -uroot -p123456 -A -B --master-data=1 --single-transaction > /data/bak.sql (3)生產環境DBA給出的命令 a、for MyISAM mysqldump --user=root --all-databases --flush-privileges --lock-all-tables \ --master-data=1 --flush-logs --triggers --routines --events \ --hex-blob > $BACKUP_DIR/full_dump_$BACKUP_TIMESTAMP.sql b、for InnoDB mysqldump --user=root --all-databases --flush-privileges --single-transaction \ --master-data=1 --flush-logs --triggers --routines --events \ --hex-blob > $BACKUP_DIR/full_dump_$BACKUP_TIMESTAMP.sql