正文 The mysqldump client utility performs logical backups, producing a set of SQL statements that can be executed to reproduce the original database ob ...
正文
The mysqldump client utility performs logical backups, producing a set of SQL statements that can be executed to reproduce the original database object definitions and table data. It dumps one or more MySQL databases for backup or transfer to another SQL server. The mysqldump command can also generate output in CSV, other delimited text, or XML format.
mysqldump是MySQL官方自帶的邏輯備份工具。備份結果是生成一系列的文本SQL語句,可以很方便地用作數據備份,也可以用於數據遷移。平時邏輯備份時用mysqldump是最多的,但也沒好好進行學習總結,本文主要就mysqldump常用選項和主要用法作個學習總結。
關於mysqldump更詳細的信息可以參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
本文使用的MySQL版本為官方社區版 5.7.24
。
(root@localhost) [test] > select version();
+------------+
| version() |
+------------+
| 5.7.24-log |
+------------+
1 row in set (0.00 sec)
主要說明
# mysqldump --help
mysqldump Ver 10.13 Distrib 5.7.24, for linux-glibc2.12 (x86_64)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Dumping structure and contents of MySQL databases and tables.
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
常用選項
連接選項(Connection Options)
--bind-address=ip_address
當MySQL伺服器有多個網路介面,指定mysqldump
連接MySQL伺服器使用的網路介面。--compress, -C
當服務端和客戶端都支持壓縮時,指定壓縮傳輸的數據。--host=host_name, -h host_name
指定需要dump數據的MySQL伺服器,預設是localhost。--port=port_num, -P port_num
指定連接MySQL伺服器的埠。--user=user_name, -u user_name
指定連接MySQL伺服器的用戶名。- --password[=password], -p[password]
指定連接MySQL伺服器的用戶密碼。- 如果命令行使用 -p 選項指定密碼,則選項與密碼串之間不允許有空格,不過命令行中密碼串明文是不安全的;
- 如果命令行選項後面沒有指定密碼串,則
mysqldump
在連接前會進行提示輸入。
--pipe, -W
在Windows環境下,指定命名管道連接MySQL伺服器。此選項僅當伺服器支持命名管道連接才生效。--socket=path, -S path
在Unix系統下指定本地連接使用socket文件,類似於Windows環境下的命名管道。
參數文件選項(Option-File Options)
--defaults-file=file_name
指定讀取的參數文件。如果這個文件不存存或是無法訪問則會報錯。--no-defaults
不讀取任何的參數文件。--print-defaults
顯示mysqldump
讀取的參數文件。
DDL選項(DDL Options)
--add-drop-database
在每行CREATE DATABASE
語句前添加DROP DATABASE
語句。這個選項通常與 --all-databases或 --databases選項一起使用,因為如果沒有指定這兩個選項之一也不會有CREATE DATABASE
語句。--add-drop-table
在dump輸出中每行CREATE TABLE
語句前添加DROP TABLE
語句。--add-drop-trigger
在dump輸出中每行CREATE TRIGGER
語句前添加DROP TRIGGER
語句。--no-create-db, -n
在dump輸出中禁止生成CREATE DATABASE
語句,即使指定了 --all-databases或 --databases選項。--no-create-info, -t
每張表dump的時候都不生成CREATE TABLE
語句。--no-tablespaces, -y
在dump輸出中都禁止生成CREATE LOGFILE GROUP
和CREATE TABLESPACE
語句。--replace
在dump輸出中使用REPLACE
語句代替INSERT
語句。
調試選項(Debug Options)
--comments, -i
在dump輸出中增加額外的信息,如mysqldump版本,MySQL版本,MySQL主機名等。預設是開啟狀態,如果要禁止,則可以指定選項 --skip-comments。--debug-info
在mysqldump
退出時列印調試信息以及CPU和記憶體的使用統計信息。--dump-date
當啟用選項 --comments時,在dump輸出中的末尾添加結束時間。可以使用選項 --skip-dump-date禁止添加。--force, -f
忽略dump表過程當中的SQL錯誤。這個選項適用於當指定dump視圖,視圖所對應的表被清除而變成invaild狀態時,mysqldump
會記錄視圖定義以及錯誤信息並繼續執行dump操作。如果未指定該選項,則mysqldump
報錯並退出。--log-error=file_name
指定警告和錯誤信息記錄的文件,預設不記錄。--verbose, -v
詳細模式,列印mysqldump
執行更詳細的信息。
國際化選項(Internationalization Options)
--character-sets-dir=dir_name
指定字元集安裝所在的目錄。--default-character-set=charset_name
指定預設的字元集,如果沒指定,預設為utf8。--set-charset
添加SET NAMES default_character_set
語句到dump文件輸出中。預設是開啟的,可以使用選項 --skip-set-charset禁止。--no-set-names, -N
關閉選項 --set-charset。
複製選項(Replication Options)
--apply-slave-statements
指定選項 --dump-slave的從庫dump過程中,在CHANGE MASTER TO
語句之前添加STOP SLAVE
語句,在dump結束之後再添加START SLAVE
語句。--delete-master-logs
在主伺服器上,在完成dump之後發送語句PURGE BINARY LOGS
到主伺服器執行。此選項會自動開啟 --master-data。--dump-slave[=value]
這個選項類似於 --master-data,只不過作用於mysqldump
在從庫生成的dump文件,即mysqldump
在從庫進行備份。這個選項的作用是為了產生一個與備份從庫相同主庫的從庫,記錄新的從庫需要從主庫開啟複製讀取的binlog文件和binlog位置,生成新的CHANGE MASTER TO
語句,binlog文件和binlog位置分別讀取來自於SHOW SLAVE STATUS
狀態語句當中的Relay_Master_Log_File
和Exec_Master_Log_Pos
值。該選項的取值與 --master-data一致。
該選項會使mysqldump
在開始dump之前停止SQL thread,而在dump結束之後再重新開啟。--include-master-host-port
指定選項 --dump-slave的從庫dump過程中,生成CHANGE MASTER TO
語句添加MASTER_HOST
和MASTER_PORT
信息以便可以通過新dump文件創建新的從庫開啟主從複製。- --master-data[=value]
在主伺服器完成mysqldump
指定該選項導出備份文件可以用來搭建從庫。在dump文件中包含了CHANGE MASTER TO
語句,該語句表示新搭建的從庫需要從主庫哪個binlog文件和位置開始進行同步。
該選項需要RELOAD
許可權和MySQL中開啟binlog,會關閉選項 --lock-tables並開啟選項 --lock-all-tables,除非指定了選項 --single-transaction。
value取值如下:- 2:則
CHANGE MASTER TO
語句是以註釋的形式存在dump文件中,在dump文件導入的過程當中並不會生效; - 1:則
CHANGE MASTER TO
語句是以非註釋的形式存在dump文件中,在dump文件導入的過程中會生效; - 未指定:則預設值為1。
- 2:則
- --set-gtid-purged=value
指定是否在dump文件中寫入SET @@GLOBAL.gtid_purged
語句,同時會導致dump文件在被重載的時候不會記錄binlog。
value取值如下:- OFF:不添加
SET @@GLOBAL.gtid_purged
語句,同時不添加SET @@SESSION.SQL_LOG_BIN=0
語句; - ON:添加
SET @@GLOBAL.gtid_purged
語句,如果沒開啟GTID則報錯,同時添加SET @@SESSION.SQL_LOG_BIN=0
語句; - AUTO:如果開啟GITD則添加
SET @@GLOBAL.gtid_purged
語句,同時添加SET @@SESSION.SQL_LOG_BIN=0
語句,預設選項。
- OFF:不添加
格式化選項(Format Options)
--compact
更加緊湊的輸出dump文件。該選項同時會開啟 --skip-add-drop-table,--skip-add-locks,--skip-comments,--skip-disable-keys和 --skip-set-charset選項。--complete-insert, -c
指定dump文件中的INSERT語句為包含所有欄位名稱的完整語句。--create-options
指定dump文件中CREATE TABLE
語句包含所有MySQL表選項。--hex-blob
轉儲二進位列為十六進位格式。涉及的類型有BINARY
、VARBINARY
、BLOB
和BIT
。--quote-names, -Q
指定dump文件中資料庫、表和欄位的引用標識符為反引號 `,預設開啟,通過選項 --skip-quote-names來禁用。如果SQL_MODE當中有ANSI_QUOTES,則標識符為雙引號 "。--result-file=file_name, -r file_name
指定dump輸出到給定文件。--tz-utc
指定dump文件中表TIMESTAMP
欄位導出格式以適應不同時區伺服器導入時值的準確性。預設是開啟,使用選項 --skip-tz-utc禁用。
過濾選項(Filtering Options)
--all-databases, -A
指定dump出所有庫當中的所有表。--databases, -B
指定dump一個或多個資料庫。該選項會在dump每個資料庫之前添加CREATE DATABASE
和USE
語句,如果沒有指定該選項,則mysqldump
將第一個參數當成是資料庫,第二個參數當成是表。通常用來備份INFORMATION_SCHEMA和performance_schema庫,預設情況下是不導出這兩個庫的。--no-data, -d
指定只dump表結構,而不dump表數據。--tables
指定dump一張或多張表。會覆蓋選項 --databases, -B,把該選項之後所有參數當成是表。--ignore-table=db_name.tbl_name
指定忽略dump某張表。格式必須是db.table
,如果有多張表需要多次指定該選項,也適用於視圖。--where='where_condition', -w 'where_condition'
指定where條件dump數據。--events, -E
指定dump資料庫中的計劃事件。需要對庫有EVENT
許可權。--routines, -R
指定dump資料庫中的函數和存儲過程。--triggers
指定dump表中的觸發器。需要對錶有TRIGGER
許可權。
性能選項(Performance Options)
--disable-keys, -K
指定dump文件里INSERT
表時添加/*!40000 ALTER TABLE tbl_name DISABLE KEYS */
語句,完成後再添加/*!40000 ALTER TABLE tbl_name ENABLE KEYS */
語句,這樣可以加快表數據導入速度,但只對有非唯一索引的MyISAM表有效果。--extended-insert, -e
指定dump文件當中的INSERT
語句為多行格式,降低dump文件大小。--insert-ignore
使用INSERT IGNORE
代替INSERT
語句。--opt
預設開啟,包含了一系列選項的集合,主要有 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset,如果要禁用,可以使用選項 --skip-opt。--quick, -q
對於大表的dump很有幫助。預設開啟。該選項使mysqldump
直接從表中獲取數據輸出而不經過MySQL的緩存。
事務選項(Transactional Options)
--add-locks
指定dump文件中每張表INSERT語句之前添加LOCK TABLES
語句,INSERT語句之後添加UNLOCK TABLES
語句。這樣可以提高導入效率。--flush-logs, -F
在dump開始之前切換日誌。該選項需要RELOAD
許可權。如果與選項 --all-databases聯合使用的話會導致每dump一個庫之前都要進行日誌切換。如果有使用選項 --lock-all-tables、--master-data或者 --single-transaction,則在dump過程當中只進行一次日誌切換。如果希望dump與日誌的切換同時發生,則使用 --flush-logs與選項 --lock-all-tables、--master-data或者 --single-transaction一同使用。--flush-privileges
在dump完mysql資料庫之後添加FLUSH PRIVILEGES
語句。--lock-all-tables, -x
在dump過程中鎖住所有資料庫中所有表。該選項會自動關閉 --single-transaction和 --lock-tables選項。--lock-tables, -l
在dump每個庫時鎖定庫中的表。這個選項只能保證庫中表的狀態一致,因為針對每個庫進行加鎖,所以無法保證所有庫都是一致狀態。--no-autocommit
指定dump文件中每條INSERT
語句包含在SET autocommit = 0
和COMMIT
語句之間。--order-by-primary
在dump每張表的時候以表的主鍵或第一個唯一索引為序。對於導出是MyISAM表而導入是InnoDB表很有用。--single-transaction
在dump開始之前將會話事務隔離級別設置成REPEATABLE READ
並執行語句START TRANSACTION
,只適用於事務引擎的表如InnoDB。當指定該選項進行dump的過程中,應該避免其它會話連接執行如下語句:ALTER TABLE,CREATE TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
,因為一致性讀並不能隔離以上語句,所以當mysqldump
執行SELECT
語句進行dump表數據時,其它會話執行以上語句容易產生數據不一致或者報錯。
該選項與 --lock-tables是互斥的,因為LOCK TABLES
語句會導致在執行的事務隱式提交。
用法示例
- 備份所有庫
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 -A > test_all.sql
- 備份一個或多個庫
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 -B test1 test2 > test1_test2.sql
- 備份一張表或多張表
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 test1 t1 > test1_t1.sql
或
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 test1 --tables t1 > test1_t1.sql
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 test1 t1 t2 > test1_t1_t2.sql
或
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 test1 --tables t1 t2 > test1_t1_t2.sql
- 備份庫結構(同時會包含表結構)
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 --no-data -B test1 test2 > test1_test2.sql
- 只備份表結構
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 --no-data test1 --tables t1 t2 > test1_t1_t2.sql
- 只備份表數據(不包含建表語句)
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 --no-create-info test1 --tables t1 t2 > test1_t1_t2.sql
- 忽略一張或多張表備份
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 test1 --ignore-table=test1.t1 --ignore-table=test1.t2 > test1_ig_t1_t2.sql
- 輸出文件通過管道傳到gzip命令進行壓縮
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 -A | gzip > test_all.sql.gz
- 指定where條件備份表數據
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 test1 --tables t1 --where='c1>1000000' > test1_t1_w.sql
不包含建表語句
# mysqldump -uadmin -p -h192.168.58.3 -P3306 -E -R --triggers --single-transaction --master-data=2 --no-create-info test1 --tables t1 --where='c1>1000000' > test1_t1_w.sql
註意事項
- 預設情況下,mysqldump是不會導出INFORMATION_SCHEMA、performance_schema和sys的,如果需要導出,則在命令行中顯示指定選項 --databases, -B;
- mysqldump不會導出InnoDB創建表空間
CREATE TABLESPACE
語句; - 不建議使用當前版本的mysqldump導出文件導入MySQL5.6.9(或更早)開啟GTID的版本;
- 如果general_log和slow_query_log都是指定存存儲在表中,mysqldump導出文件包含general_log和slow_query_log表的創建語句,但並不包含表數據。
參考
- https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
- https://www.xp8.net/data/788.html
- http://www.ywnds.com/?p=3867
☆〖本人水平有限,文中如有錯誤還請留言批評指正!〗☆