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

原文地址:https://www.cnblogs.com/gered/p/15344251.html