mysqldump與mysqlpump比較


本文版本 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 USERGRANT) 而不是插入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 USERGRANT) 而不是插入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啊!

 

【參考文檔】

https://www.jb51.net/article/212882.htm

https://blog.csdn.net/Hehuyi_In/article/details/102981945


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM