一、備份命令:mysqldumpmysql
MySQL數據庫自帶的一個很好用的備份命令。是邏輯備份,導出 的是SQL語句。也就是把數據從MySQL庫中以邏輯的SQL語句的形式直接輸出或生成備份的文件的過程。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
二、參數解析shell
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
三、恢復操做服務器
語法(Syntax): mysql -u<username> -p<password> <dbname> < /opt/mytest_bak.sql #庫必須保留,空庫也可 說明:指定dbname,至關於use <dbname>
四、示例ide
(1)無參數備份數據庫mytest和恢復wordpress
(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調試)spa
(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)指定壓縮命令來壓縮備份文件debug
(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