本文版本 mysql 5.7.26
【mysqldump默認參數】
all-databases FALSE all-tablespaces FALSE no-tablespaces FALSE add-drop-database FALSE add-drop-table TRUE add-drop-trigger FALSE add-locks TRUE allow-keywords FALSE apply-slave-statements FALSE bind-address (No default value) character-sets-dir (No default value) comments TRUE compatible (No default value) compact FALSE complete-insert FALSE compress FALSE create-options TRUE databases FALSE default-character-set utf8 delete-master-logs FALSE disable-keys TRUE dump-slave 0 events FALSE extended-insert TRUE fields-terminated-by (No default value) fields-enclosed-by (No default value) fields-optionally-enclosed-by (No default value) fields-escaped-by (No default value) flush-logs FALSE flush-privileges FALSE force FALSE hex-blob FALSE host (No default value) ignore-error (No default value) include-master-host-port FALSE insert-ignore FALSE lines-terminated-by (No default value) lock-all-tables FALSE lock-tables TRUE log-error (No default value) master-data 0 max-allowed-packet 25165824 net-buffer-length 1046528 no-autocommit FALSE no-create-db FALSE no-create-info FALSE no-data FALSE order-by-primary FALSE port 3306 quick TRUE quote-names TRUE replace FALSE routines FALSE set-charset TRUE single-transaction FALSE dump-date TRUE socket /data/mysql/mysql.sock secure-auth TRUE ssl TRUE ssl-verify-server-cert FALSE ssl-ca (No default value) ssl-capath (No default value) ssl-cert (No default value) ssl-cipher (No default value) ssl-key (No default value) ssl-crl (No default value) ssl-crlpath (No default value) tls-version (No default value) tab (No default value) triggers TRUE tz-utc TRUE user (No default value) verbose FALSE where (No default value) plugin-dir (No default value) default-auth (No default value) enable-cleartext-plugin FALSE
(1.1)mysqldump默認啟動的參數(5.7)
我們可以看到 為 true的
add-drop-table TRUE -- 有 drop table if exist add-locks TRUE -- 允許加鎖,避免tuncate alter 等ddl comments TRUE -- 導出注釋 create-options TRUE -- 創建語句 default-character-set utf8 -- 默認utf8 字符集 disable-keys TRUE -- 使用ALTER TABLE ... DISABLE KEYS要告訴MySQL停止更新非唯一索引 dump-slave 0 -- 是否是在從庫備份,開啟參數為1 可以獲取到主庫binlog位置 extended-insert TRUE -- 默認可以把所有數據從每行數據1個insert into,變成insert into values(),() lock-tables TRUE -- 默認運行鎖表 master-data 0 -- 默認不做任何binlog情況操作與收集 max-allowed-packet 25165824 -- 每次導出的最大包大小 net-buffer-length 1046528 -- TCP/IP SOCKET連接 緩存大小 port 3306 -- 默認端口 3306 quick TRUE -- 不要用 buffer 緩存mysqldump里的查詢,直接轉儲到標准輸出 quote-names TRUE -- 就是把表名、列名等使用 `` 包起來,以免與關鍵字等沖突 set-charset TRUE -- 增加 SET NAMES default_character_set 到默認輸出 dump-date TRUE -- 在標准輸出最末尾,加上dump完成時間 socket /data/mysql/mysql.sock -- 默認 mysql socket 位置,這個是我在 my.cnf 中的 [mysql] 里面改了,默認的應該是 /var/local/mysql 下目錄 secure-auth TRUE -- 默認拒絕使用 4.1.1之前的老協議連接 ssl TRUE -- 默認支持ssl triggers TRUE -- 默認會導出觸發器 tz-utc TRUE -- 允許時區
【2】mysqlpump(5.7)
(2.1)功能特性
-
並行處理數據庫和數據庫中的對象,以加快轉儲過程
-
更好地控制要轉儲的數據庫和數據庫對象(表、存儲的程序、用戶帳戶)
-
將用戶帳戶轉儲為帳戶管理語句 (
CREATE USER
,GRANT
) 而不是插入mysql
系統數據庫 -
創建壓縮輸出的能力
-
進度指標(數值為估計值)
-
對於轉儲文件重新加載,
InnoDB
通過在插入行后添加索引來更快地為表 創建二級索引
(2.2)常用參數
參數 |
說明 |
---|---|
--default-parallelism=# |
設置並行導出的並發度默認為2,如果為0則不並行,5.7.11后解決了--single-transaction才能與--default-parallelism共用 |
--single-transaction |
創建一個單獨的事務來導出所有的表,5.7.11后解決了--single-transaction才能與--default-parallelism共用 |
--exclude-databases=name |
導出時排除掉某些庫,多個庫以逗號分隔 |
--exclude-tables=name |
導出時排除掉某些表,多個表以逗號分隔 |
--include-databases=name |
導出時包含某些庫,多個庫以逗號分隔 |
--include-tables=name |
導出時包含某些表,多個表以逗號分隔 |
--users |
導出 create user ,grant 語句 |
(2.3)mysqlpump自帶默認參數(5.7)
default-character-set UTF8MB4 -- 默認字符集 default-parallelism 2 -- 默認2線程 defer-table-indexes TRUE -- 在導出所有行之后,再加索引 events TRUE -- 默認導出事件 extended-insert 250 -- 把每行一個 insert into 變成 max-allowed-packet 25165824 -- 默認最大包大小 net-buffer-length 1047552 -- 網絡緩存大小 password * -- 密碼 port 3306 -- 端口 routines TRUE -- 默認自帶存儲過程 set-charset TRUE -- set names default-character-set set-gtid-purged AUTO -- 自動,但不寫會報錯 socket /data/mysql/mysql.sock --socket triggers TRUE -- 默認自帶存儲過程 tz-utc TRUE -- 支持時區 watch-progress TRUE -- 導出時顯示進度
到8.0 默認的 存儲過程,觸發器等參數 又會因為系統表的改進而默認不備份,所以無論什么時候什么情況,存儲過程、事件、觸發器等 參數還是加上吧;
【最佳實踐】mysqldump與mysqlpupm對比
(1)構造5個100W行數據表
sysbench參考:https://www.cnblogs.com/gered/p/14142946.html#autoid-5-0-0
sysbench oltp_common --mysql_storage_engine=innodb --db-driver=mysql --mysql-host=localhost --mysql-port=3306 \
--mysql-user=root --mysql-password=bfgame20 --mysql-db=test --threads=4 --table_size=1000000 --tables=5 --mysql-socket=/data/mysql/mysql.sock prepare
(2)實際執行時間對比
mysqldump:
time mysqldump --single_transaction --default-character-set=utf8mb4 --master-data=2 test sbtest1 sbtest2 sbtest3 sbtest4 sbtest5 >/data/tmp.txt Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. real 0m12.329s user 0m10.500s sys 0m1.304s
mysqlpump:
time mysqlpump --default-character-set=utf8mb4 --set-gtid-purged=ON --host=localhost --single-transaction test sbtest1 sbtest2 sbtest3 sbtest4 sbtest5 >/data/tmp1.txt mysqlpump: [WARNING] (1429) Unable to connect to foreign data source: Access denied for user 'leoaprd'@'10.20.53.12' (using password: mysqlpump: [WARNING] (1429) Unable to connect to foreign data source: Access denied for user 'leoaprd'@'10.20.53.12' (using password: Dump progress: 0/5 tables, 250/4932000 rows Dump progress: 0/5 tables, 806250/4932000 rows Dump progress: 0/5 tables, 1700250/4932000 rows Dump progress: 2/5 tables, 2611250/4932000 rows Dump progress: 2/5 tables, 3520000/4932000 rows Dump progress: 4/5 tables, 4204500/4932000 rows Dump progress: 4/5 tables, 4636000/4932000 rows Dump completed in 7608 milliseconds real 0m7.676s user 0m11.274s sys 0m0.937s
執行效率結論:
同500W行,那么 mysqlpump 默認使用了多線程基於表的並行 導出;所以快了不少
500W數據,5個表
mysqldump:12.32s mysqlpump:7.67s
(3)導出內容對比
概述:mysqldump mysqlpump導出的內容影響
MySQL8.0之后,在使用mysqldump和mysqlpump導出數據時候,與之前有了一些不同,主要是以下幾點:
之前版本的mysqldump和mysqlpump可以導出mysql系統庫中的所有表的內容,8.0之后,只能導出mysql系統庫中沒有數據的數據字典表。
之前版本當使用 --all-databases 參數導出數據的時候,不加 --routines和 --events選項也可以導出觸發器、存儲過程等信息;
因為這些信息都存放於proc和event表中,導出所有表即可導出這些信息。
但是在8.0中,proc表和event表都不再使用,並且定義觸發器、存儲過程的數據字典表不會被導出,所以在8.0中使用mysqldump、mysqlpump導出數據的時候,如果需要導出觸發器、存儲過程等內容,一定需要加上 --routines和 --events選項。
之前版本中 --routines選項導出的時候,備份賬戶需要有proc表的SELECT權限,在8.0中需要對所有表的SELECT權限
之前版本中,導出觸發器、存儲過程可以同時導出觸發器、存儲過程的創建和修改的時間戳,8.0中不再支持。
(3.1)導出內容的實質區別
mysqldump | mysqlpump |
固定根據max_allow_packet,拆分insert into values個數 | 根據extended-insert ,默認每250行匯成一個Insert |
建一個表,插入一個表的數據 | 並行N個線程,會先建N個表,插入N個表的數據 |
建表時建好所有索引,然后禁用非唯一索引插入數據 | 建表時只建立唯一索引(主鍵也算),插完數據后建其他索引 |
可以保證一致性 --single_transaction | 就算不使用 --single_transaction 也可以保證一致性 |
可以通過--master-data 來獲取binlog位置 | 無法獲取binlog 位置,只能獲取gtid,且set-gtid-purged必填 |
mysqlpump 還有相關優點:
-
並行處理數據庫和數據庫中的對象,以加快轉儲過程
-
更好地控制要轉儲的數據庫和數據庫對象(表、存儲的程序、用戶帳戶)
-
將用戶帳戶轉儲為帳戶管理語句 (
CREATE USER
,GRANT
) 而不是插入mysql
系統數據庫 -
創建壓縮輸出的能力
-
進度指標(數值為估計值)
-
對於轉儲文件重新加載,
InnoDB
通過在插入行后添加索引來更快地為表 創建二級索引
(4)優缺點對比
mysqlpump
- 優點:
-
-
- 基於表並行備份數據庫和數據庫中對象,加快備份過程。(--default-parallelism)
- 更好地控制數據庫和數據庫對象(表,存儲過程,用戶帳戶)的備份。
- 備份用戶賬號作為帳戶管理語句(CREATE USER,GRANT),而不是直接插入到MySQL的系統數據庫。
- 支持直接壓縮導出
- 導出可顯示進度(估計值)。
- 導出時可以排除或指定數據庫。
- 導入備份文件時,先建表后插入數據最后建立索引,減少了索引維護開銷,加快了還原速度。
-
- 缺點:
- 官方表示在5.7.11之前無法保證數據的一致性,所以5.7.11之前該工具基本無法使用
- 5.7.11之前,--defaut-parallelism>0時與--single-transaction互斥,無法使用並行。直到5.7.11才解決了--single-transaction和--default-parallelism互斥的問題
- 只能並行到表級別,如果有一個表數據量特別大那么會存在非常嚴重的短板效應,甚至不如mysqldump。
- 導出的數據保存在一個文件中,導入仍舊是單線程,效率較低。
- 無法獲取當前備份對應的binlog位置。
- 無法多版本兼容,不像Mysqldump 什么版本都可以用,yyds啊!
【參考文檔】