mysqlpump

mysqlpump

简介

并行导出的架构为: 队列(库) + 线程(表)

并行度最细细为表级别

特性:

  1. 属于逻辑备份
  2. 并行备份 数据库和数据库中的对象的, 加快备份过程
  3. 更好的控制数据库和数据库对象(表, 存储过程, 用户帐户)的备份
  4. 备份用户账号作为帐户管理语句(CREATE USER, GRANT), 而不是直接插入到 MySQL 的系统数据库
  5. 备份出来直接生成压缩后的备份文件
  6. 备份进度指示(估计值)
  7. 重新加载(还原)备份文件, 先建表后插入数据最后建立索引, 减少了索引维护开销, 加快了还原速度
  8. 备份可以排除或则指定数据库

示例

# 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 来关闭参数
最后更新于