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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章