mydumper和myloader逻辑并行导出和导入
mydumper和myloader逻辑并行导出和导入
前言
MySQL自身的mysqldump工具支持单线程工作,依次一个个导出多个表,没有一个并行的机,这就使得它无法迅速的备份数据。
mydumper作为一个实用工具,能够良好支持多线程工作,可以并行的多线程的从表中读入数据并同时写到不同的文件里,这使得它在处理速度方面快于传统的mysqldump。其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起DML阻塞。但一般现在的MySQL都有主从,备份也大部分在从上进行,所以锁的问题可以不用考虑。这样,mydumper能更好的完成备份任务。
- mydumper负责导出 MySQL 数据库的一致备份
- myloader从 mydumper 读取备份,连接到目标数据库并导入备份。
工具对比
对比mysqldump、mysqlpump、mydumper和xtrabackup四个工具优劣

下载地址:
https://github.com/maxbube/mydumper/releases/
mydumper特性
- 多线程备份
- 因为是多线程逻辑备份,备份后会生成多个备份文件
- 备份时对MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),会阻塞DML语句
- 保证备份数据的一致性
- 支持文件压缩
- 支持导出binlog
- 支持多线程恢复
- 支持以守护进程模式工作,定时快照和连续二进制日志
- 支持将备份文件切块,按照指定大小将备份文件切割
- 导出
- 数据与建表语句分离
- 支持通过mydumper和myloader做主从环境搭建
工作原理
mydumper主要流程概括
1、主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,以阻止DML语句写入,保证数据的一致
性
2、读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用
3、N个(线程数可以指定,默认是4)dump线程 START TRANSACTION WITH CONSISTENT SNAPSHOT;
开启读一致的事务
4、dump non-InnoDB tables, 首先导出非事务引擎的表
5、主线程 UNLOCK TABLES 非 事务引擎备份完后,释放全局只读锁
6、dump InnoDB tables, 基于 事务导出InnoDB表
7、事务结束
备份所生成的文件
- 目录中包含一个metadata文件,记录了备份数据库在备份时间点的二进制日志文件名,日志的写入位置,
- 如果是在从库进行备份,还会记录备份时同步至主库的二进制日志文件及写入位置
每个表有两个备份文件:
- database.table-schema.sql 表结构文件
- database.table.sql 表数据文件
如果对表文件分片,将生成多个备份数据文件,可以指定行数或指定大小分片
参数介绍
# mydumper
-B, --database # 指定导出的数据库
-o, --outputdir # 要将文件输出到的目录
-d, --no-data # 不导出表数据
-D, --daemon # 启用守护程序模式
-L, --logfile # 要使用的日志文件名,默认情况下使用标准输出
--disk-limits # 如果确定没有足够的磁盘空间,则设置暂停和恢复的限制。接受以下值:'<resume>:<pause>',以MB为单位。例如:100:500 当只有100MB可用时将暂停,如果有500MB可用时将恢复
-t, --threads # 要使用的线程数,默认为4
-C, --compress-protocol # 对MySQL连接使用压缩
-V, --version # 显示程序版本并退出
-v, --verbose # 输出的详细性,0=无提示,1=错误,2=警告,3=信息,默认值2
--defaults-file # 使用特定的默认文件
--ssl # 使用SSL连接
--ssl-mode # 与服务器连接的所需安全状态:DISABLED, PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY
--key # 密钥文件的路径名
--cert # 证书文件的路径名
--ca # 证书颁发机构文件的路径名
--capath # 包含PEM格式的受信任SSL CA证书的目录的路径名
--cipher # 用于SSL加密的允许密码列表
--tls-version # 服务器允许加密连接使用哪些协议
--stream # 一旦文件被写入,它将通过标准输出流
--no-delete # 流完成后,它不会删除文件
-O, --omit-from-file # 包含数据库列表的文件。要跳过的表条目,每行一个(在应用regex选项之前跳过)
-T, --tables-list # 要备份的表,以逗号隔开(不排除regex选项)
-h, --host # 连接的主机地址
-u, --user # 用户名
-p, --password # 密码
-a, --ask-password # 提示输入用户密码
-P, --port # 端口
-S, --socket # 用于连接的UNIX域套接字文件
-x, --regex # 正则表达式
-G, --triggers # 导出触发器。默认情况下,不会转储触发器
--split-partitions # 将分区转储到单独的文件中。此选项覆盖分区表的--rows选项。
--max-rows # 在估计表之后,限制每个块的行数,默认为1000000
--no-check-generated-fields # 与生成的字段相关的查询将不会被执行。如果生成了列,则会导致恢复问题
--order-by-primary # 如果不存在主键,则按主键或唯一键对数据排序
-E, --events # 转储事件。缺省情况下,不转储事件
-R, --routines # 转储存储过程和函数。默认情况下,它不转储存储过程或函数
-W, --no-views # 不转储视图
-M, --checksum-all # 转储所有元素的校验和
--data-checksums # 用数据转储表校验和
--schema-checksums # 转储模式表和视图创建校验和
--routine-checksums # 转储触发器、函数和例程校验和
--tz-utc # 在转储的顶部设置TIME_ZONE='+00:00',以允许在服务器具有不同时区的数据或数据在不同时区的服务器之间移动时转储时间戳数据,默认情况下使用——skip-tz-utc禁用。
--complete-insert # 使用包含列名的完整INSERT语句
-z, --tidb-snapshot # 用于TiDB的快照
-N, --insert-ignore # 使用INSERT IGNORE转储行
--replace # 使用REPLACE转储行
--exit-if-broken-table-found # 如果遇到损坏的表则退出
--success-on-1146 # 如果表不存在,则不增加错误计数和警告而不是关键
--use-savepoints # 使用保存点减少元数据锁定问题,需要SUPER特权
-s, --statement-size # 尝试INSERT语句的大小(以字节为单位),默认为1000000
-F, --chunk-filesize # 将表拆分为输出文件大小的块。该值的单位是MB
-e, --build-empty-files # 即使表中没有可用的数据,也要构建转储文件
--where # 只转储选定的记录
-i, --ignore-engines # 逗号分隔的要忽略的存储引擎列表
--csv # 自动启用--load-data并设置变量以CSV格式导出。
-r, --rows # 尝试将表分成这样多行的块。这个选项关闭--chunk-filesize
-c, --compress # 压缩输出文件
--exec # 命令使用文件作为参数执行
--long-query-retries # 重试检查长查询,默认为0(不重试)
--long-query-retry-interval # 重新尝试长查询检查之前的等待时间(以秒为单位),默认为60
-l, --long-query-guard # 以秒为单位设置长查询定时器,默认为60秒
--tidb-snapshot # 用于TiDB的快照
-U, --updated-since # 使用Update_time只转储最近U天更新的表
-k, --no-locks # 不执行临时共享读锁。警告:这将导致不一致的备份
-Y, --all-tablespaces # 转储所有表空间。
--no-backup-locks # 不使用Percona备份锁
--lock-all-tables # 使用LOCK TABLE代替FTWRL
--less-locking # 最小化InnoDB表的锁时间。
-m, --no-schemas # 不备份表数据
-K, --kill-long-queries # 终止长时间运行的查询(而不是中止)
--set-names # 设置名称,使用风险自负,默认二进制
导出后文件命名规则大致如下:
dbname-schema-create.sql:建库语句。
dbname-schema-post.sql:包含事件、存储过程及函数创建语句(若存在则有该文件)。
dbname.tbname.metadata:记录这个表的行数。
dbname.tbname-schema.sql:此表的创建语句。
dbname.tbname-schema-triggers.sql:创建触发器语句(若该表存在触发器 则有此文件)。
dbname.tbname.sql:该表的插入数据语句(若该表为空 则不存在此文件)。
dbname.viewname-schema.sql:创建视图语句(只列举出视图字段)。
dbname.viewname-schema-view.sql:创建视图的真正语句。
metadata:记录开始及结束备份的时间以及二进制日志位置。
myloader使用
使用myloader --help查看选项参数:
-d, --directory # 要导入的转储文件的目录
-q, --queries-per-transaction # 每个事务的查询数,默认为1000
-o, --overwrite-tables # 如果存在表则删除
--append-if-not-exist # 添加IF NOT EXISTS到建表语句中
-B, --database # 还原到的数据库(目标库)
-s, --source-db # 被还原的数据库(源数据库),-s db1 -B db2,表示源库中的db1数据库,导入到db2数据库中。
-e, --enable-binlog # 启用还原数据的二进制日志记录
--innodb-optimize-keys # 创建没有索引的表,并在最后添加索引
--set-names # 设置名称,使用风险自负,默认二进制
-L, --logfile # 要使用的日志文件名称,默认使用标准输出
--purge-mode # 指定截断模式,可以是:NONE, DROP, TRUNCATE and DELETE
--disable-redo-log # 禁用REDO_LOG,然后启用它,不检查初始状态
-r, --rows # 将INSERT语句拆分为这么多行。
--max-threads-per-table # 每个表使用的最大线程数,默认为4
--skip-triggers # 跳过触发器。默认情况下,它导入触发器
--skip-post # 跳过事件、存储过程和函数。默认情况下,它导入事件、存储过程或函数
--no-data # 不导入表数据
--serialized-table-creation # 重新创建表将以每次一个线程的方式执行
--resume # 期望在备份目录中找到恢复文件,并只处理那些文件
--pmm-path # 默认值将是/usr/local/percona/pmm2/collectors/textfile-collector/high-resolution
-t, --threads # 要使用的线程数,默认为4
-C, --compress-protocol # 在MySQL连接上使用压缩
-V, --version # 显示程序版本并退出
-v, --verbose # 输出的详细性,0=无提示,1=错误,2=警告,3=信息,默认值2
--no-delete # 不会在流完成后删除文件
-O, --omit-from-file # 包含数据库列表的文件。要跳过的表项,每行一个(在应用regex选项之前跳过)
-T, --tables-list # 要备份的表,以逗号隔开(不排除regex选项)
-h, --host # 连接的主机地址
-u, --user # 用户名
-p, --password # 密码
-a, --ask-password # 提示输入用户密码
-P, --port # 端口
-S, --socket # 用于连接的UNIX域套接字文件
-x, --regex # 正则表达式
--skip-definer # 从CREATE语句中移除DEFINER。缺省情况下,不修改语句
常用命令:
#备份全库:
mydumper -u root -p '123' -o /data/backup/
# 备份test数据库:
mydumper -u root -p '123' -B test -o /data/backup/
#备份多张表(tableA,tableB):
mydumper -u root -p '123' -B test -T tableA,tableB -o /data/backup/
#备份tableA表的数据,不备份表结构
mydumper -u root -p '123' -B test -T tableA -m -o /data/backup/
#备份tableA表的数据,并进行压缩
mydumper -u root -p '123' -B test -T tableA -c -o /data/backup/
#还原test库:
myloader -u root -p '123' -B test -d /data/backup/
#还原tableA表
myloader -u root -p '123' -B test -o tableA -d /data/backup/
从备份中恢复指定的库:
$ myloader -u root -p 123456 -s testdb -o -d /backup/mysql/
导入时开启binlog:
$ myloader -u root -p 123456 -e -s testdb -o -d /backup/mysql/
将源库的testdb导入到备库的test01库:
$ myloader -u root -p 123456 -B test01 -s testdb -o -d /backup/mysql/
导入特定的表:
在导出的目录中选择metadata文件和需要单独导入的表的结构文件和数据文件移到一个新目录下,最好提前建好库表,否则需要把建库表的文件一起移动到新目录,移动到新目录后可以使用myloader指定新目录进行恢复数据。
使用案例
排除多个数据库
mydumper -u root -p xxxx -P 3306 -t 12 --compress --regex '^(?!(mysql|sys|information_schema|performance_schema|sysbench_test|sysbench_test|test|iuap_yms_data_1015|iuap_data_dolphinscheduler_0923|fieeac_0918|epmp_dcp_20250211|fieaai_1021|fieaai_20241018|fieaai_test|diwork_report_0923|__tencentdb__|polardb_test|ai_alg|ai_alg_dev|ai_alg_uat|gkdb_bip_amb_data_all_test|gkdb_bip_amb_data_tz|gkdb_bip_amb_tz|gkdb_bip_ambs_test|goldkinn_mes_dev|goldkinn_mes_pre|goldkinn_mes_test))' --events --routines --triggers --less-locking --kill-long-queries --logfile=/tmp/backup.log --outputdir=/data/mysqlbackup/mydumper
--regex #排除sys、information_schema等数据库
-t 12 12个线程
--events --routines --triggers #导出事件、触发器、存储过程
--kill-long-queries # 终止长时间运行的查询(而不是中止),这个命令不可在正式环境有业务的主库上使用,否则可能查杀正常的业务会话
导出指定表:
mydumper -u root -p xxxx -P 3306 -t 12 --compress -B fieaai_test -T aai_voucher_record -o /data/mysqlbackup/aai_voucher_record
导入:
myloader -u test -p 'xxxxx' -P 15011 --host 192.168.205.181 --overwrite-tables --directory /data/backup/mydumper/ --threads 20 --verbose 3

浙公网安备 33010602011771号