mysqlpump
简介
并行导出的架构为: 队列(库) + 线程(表)
并行度最细细为表级别
特性:
- 属于逻辑备份
- 并行备份 数据库和数据库中的对象的, 加快备份过程
- 更好的控制数据库和数据库对象(表, 存储过程, 用户帐户)的备份
- 备份用户账号作为帐户管理语句(CREATE USER, GRANT), 而不是直接插入到 MySQL 的系统数据库
- 备份出来直接生成压缩后的备份文件
- 备份进度指示(估计值)
- 重新加载(还原)备份文件, 先建表后插入数据最后建立索引, 减少了索引维护开销, 加快了还原速度
- 备份可以排除或则指定数据库
示例
# mysqlpump 压缩备份 + 三个并发线程备份
mysqlpump -u user1 -p -h 192.168.1.20 --single-transaction \
--default-character-set=utf8mb4 --compress-output=LZ4 \
--default-parallelism=3 -B db1 > /home/user1/db1.sql.lz4核心参数
绝大部分参数和 mysqldump 一致
差异部分
--add-drop-user
在 CREATE USER 语句之前增加 DROP USER,
注意: 这个参数需要和 --users 一起使用, 否者不生效
DROP USER 'backup'@'192.168.123.%';
--default-parallelism
指定并行线程数, 默认是 2, 如果设置成 0, 表示不使用并行备份;
注意: 每个线程的备份步骤是:
先 create table 但不建立二级索引(主键会在 create table 时候建立),
再写入数据, 最后建立二级索引;
--defer-table-indexes
延迟创建索引, 直到所有数据都加载完之后, 再创建索引, 默认开启;
若关闭则会和 mysqldump 一样:
先创建一个表和所有索引, 再导入数据,
因为在加载还原数据的时候要维护二级索引的开销, 导致效率比较低;
关闭使用参数 --skip--defer-table-indexes
--parallel-schemas=[N:]db_list
指定并行备份的库, 多个库用逗号分隔,
如果指定了 N, 将使用 N 个线程的地队列,
如果 N 不指定, 将由 --default-parallelism 才确认 N 的值, 可以设置多个 --parallel-schemas
mysqlpump --parallel-schemas=4:vs,aa --parallel-schemas=3:pt
# 4 个线程备份 vs 和 aa, 3 个线程备份 pt; 通过 show processlist 可以看到有 7 个线程
mysqlpump --parallel-schemas=vs,abc --parallel-schemas=pt
# 默认 2 个线程, 即 2 个线程备份 vs 和 abc, 2 个线程备份 pt
注意: 当然硬盘 IO 不允许的话, 可以少开几个线程和数据库进行并行备份
--compress-output
默认不压缩输出, 目前可以使用的压缩算法有 LZ4 和 ZLIB
shell> mysqlpump --compress-output=LZ4 > dump.lz4
shell> lz4_decompress dump.lz4 dump.txt
shell> mysqlpump --compress-output=ZLIB > dump.zlib
shell> zlib_decompress dump.zlib dump.txt
--exclude-databases
备份排除该参数指定的数据库, 多个用逗号分隔
类似的还有:
--exclude-events
--exclude-routines
--exclude-tables
--exclude-triggers
--exclude-users
mysqlpump --exclude-databases=mysql,sys # 备份过滤 mysql 和 sys 数据库
mysqlpump --exclude-tables=rr,tt # 备份过滤所有数据库中 rr, tt 表
mysqlpump -B test --exclude-tables=tmp_ifulltext,tt # 备份过滤 test 库中的 rr, tt 表
注意: 要是只备份数据库的账号, 需要添加参数 --users, 并且需要过滤掉所有的数据库, 如:
mysqlpump --users --exclude-databases=sys,mysql,db1,db2 --exclude-users=dba,backup
# 备份除 dba 和 backup 的所有账号
--include-databases
指定备份数据库, 多个用逗号分隔, 类似的还有
--include-events
--include-routines
--include-tables
--include-triggers
--include-users, 大致方法使用同 --exclude-users
--skip-definer
忽略那些创建视图和存储过程用到的 DEFINER 和 SQL SECURITY 语句,
恢复的时候, 会使用默认值, 否则会在还原的时候看到没有 DEFINER 定义时的账号而报错
--skip-dump-rows
只备份表结构, 不备份数据, -d
注意: mysqldump 支持 --no-data, mysqlpump 不支持 --no-data
--users
备份数据库用户, 备份的形式是 CREATE USER..., GRANT...,
只备份数据库账号可以通过如下命令:
mysqlpump --exclude-databases=% --users # 过滤掉所有数据库
--watch-progress # 显示进度, 包括总数表, 行和其他对象;
--skip-watch-progress # 关闭进度显示
--add-drop-database # 在建立库之前先执行删库操作
--add-drop-table # 在建表之前先执行删表操作
--add-locks
备份表时, 使用 LOCK TABLES 和 UNLOCK TABLES
注意: 这个参数不支持并行备份, 需要关闭并行备份功能 --default-parallelism=0
--complete-insert # dump 出包含所有列的完整 insert 语句
--compress # 压缩客户端和服务器传输的所有的数据, -C
--default-character-set # 指定备份的字符集
--events # 备份数据库的事件, 默认开启, 关闭使用 --skip-events 参数
--insert-ignore
备份用 insert ignore 语句代替 insert 语句
--log-error-file
# 备份出现的 warnings 和 erros 信息输出到一个指定的文件
--max-allowed-packet
# 备份时用于 client/server 直接通信的最大 buffer 包的大小
--net-buffer-length
备份时用于 client/server 通信的初始 buffer 大小,
当创建多行插入语句的时候, mysqlpump 创建行到 N 个字节长
--no-create-db
备份不写 CREATE DATABASE 语句;
要是备份多个库, 需要使用参数 -B, 而使用 -B 的时候会出现 create database 语句,
该参数可以屏蔽 create database 语句
--no-create-info
备份不写建表语句, 即不备份表结构, 只备份数据, -t
--hex-blob
备份 binary 字段的时候使用十六进制计数法,
受影响的字段类型有 BINARY, VARBINARY, BLOB, BIT
--protocol={TCP|SOCKET|PIPE|MEMORY} # 指定连接服务器的协议
--replace # 备份出来 replace into 语句
--routines
备份出来包含存储过程和函数, 默认开启, 需要对 mysql.proc 表有查看权限;
生成的文件中会包含 CREATE PROCEDURE 和 CREATE FUNCTION 语句以用于恢复,
关闭则需要用 --skip-routines 参数
--triggers
备份出来包含触发器, 默认开启, 使用 --skip-triggers 来关闭
--set-charset
备份文件里写 SET NAMES default_character_set 到输出, 此参默认开启;
--skip-set-charset 禁用此参数, 不会在备份文件里面写出 set names...
--single-transaction
该参数在事务隔离级别设置成 Repeatable Read,
并在 dump 之前发送 start transaction 语句给服务端;
这在使用 innodb 时很有用, 因为在发出 start transaction 时, 保证了在不阻塞任何应用下的一致性状态;
对 myisam 和 memory 等非事务表, 还是会改变状态的,
当使用此参的时候要确保没有其他连接在使用
ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE 等语句,
否则会出现不正确的内容或则失败;
--add-locks 和此参互斥,
在 mysql5.7.11 之前, --default-parallelism 大于 1 的时候和此参也互斥,
必须使用 --default-parallelism=0;
5.7.11 之后解决了 --single-transaction 和 --default-parallelism 的互斥问题
--tz-utc
备份时会在备份文件的最前几行添加 SET TIME_ZONE='+00:00'
注意: 如果还原的服务器不在同一个时区并且还原表中的列有 timestamp 字段, 会导致还原出来的结果不一致;
默认开启该参数, 用 --skip-tz-utc 来关闭参数最后更新于