1. 程式人生 > 其它 >mysqldump備份和恢復

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:指定連線的使用者名稱。

 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

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