# 当前最新 release
wget https://github.com/mydumper/mydumper/releases/download/v0.14.4-8/mydumper-0.14.4-8.el7.x86_64.rpm
# 安装
rpm -ivh mydumper-0.14.4-8.el7.x86_64.rpm
支持全库导出
支持指定库导出
支持指定表导出
支持按正则匹配名称进行导出
支持多线程导入、导出
支持单事务备份
导出函数、存储过程
支持 checksum 和行号统计(备份后输出到metadata文件中)
支持备份视图(备份数据同时备份视图)
支持备份存储过程(需要开启参数)
支持单独备份表结构(导出参数设置),支持只恢复表结构(导入参数设置)
# 连接相关
-u, --user # 用户名
-p, --password # 直接输入密码
-a, --ask-password # 终端获取密码
-h, --host 127.0.0.1 # 指定地址
-P, --port 3306 # 指定端口
-S, --socket # 指定socket文件
-C, --compress-protocol # 压缩连接
-t, --threads 8 # 指定线程
# 指定需要备份的库、表
-B, --database thc_5000_dev5a # 指定数据库
-T, --tables-list db.a,db.b,db.c # 指定表列表(明确定义,非正则)
-O, --omit-from-file # 文件中按照 db.table 的格式按行声明(不支持正则)跳过的 库.表(优先级大于正则匹配)
-x, --regex # 正则表达式, 匹配 "db.table" 部分. e.g: thc_5000_dev5a\.wh_.*
--partition-regex # 根据"数据库分区"进行备份
--where # 根据查询结果进行备份, 配合 -B, -T 或 -x 对库表进行限制,只需填写条件, --where id=3
-U, --updated-since # 根据 update_time 进行备份
# statement 相关设置
-s, --statement-size # 单条sql大小限制, 默认1000000,使用需调大
-r, --rows 0 # 导出时单个sql文件的行数,0 表示没有限制
# 锁设置
--trx-consistency-only # 单事务备份,对标 mysqldump --single-transaction 参数,刷盘后开启事务保持数据一致性
--less-locking. # 使用线程锁,减少全局锁的加锁时间
-k, --no-locks # 不锁
--no-backup-locks
# 对比检查相关,记录到 metadata 文件
-M, --checksum-all # 所有
--data-checksums # 计算并记录 数据sql sum 值
--schema-checksums # 计算并记录 创建sql sum值
--routine-checksums # 计算并记录 视图、函数、触发器 sum值
# 输出相关
-o, --outputdir /backup/xx # 输出目录
-c, --compress # 压缩文件
# 备份可选项
-G, --triggers # 备份触发器,默认不备份
-E, --events # 备份事件,默认不备份
-R, --routines # 备份存储过程、函数,默认不备份
--views-as-tables # 把视图当做表进行导出
-W, --no-views # 不备份视图, 默认进行备份
-d, --no-data # 只备份表结构
--skip-definer # 备份视图、函数、存储过程、事件等时不备份definer
--set-names utf8mb4 # 指定字符集
# 处理长时间查询
--long-query-retries # 尝试检查长时间的查询,默认0,不重试
--long-query-retry-interval # 检查长时间查询的语句的间隔,默认60s
--long-query-guard , -l # 长时间执行超时秒数,默认60s
--kill-long-query , -K # 杀掉长时间的查询而不是终止dump操作
# 其他
-v, --verbose # 指定日志级别,0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
-L, --logfile # 记录日志
--disk-limits # --disk-limits 100:500 当磁盘剩余空间小于100M时暂停,500M时恢复
--defaults-file # 可指定配置文件,用于隐藏账号密码
--defaults-extra-file
-u, --user # 用户名
-p, --password # 直接输入密码
-a, --ask-password # 终端获取密码
-h, --host 127.0.0.1
-P, --port 3306
-C, --compress-protocol # 连接就压缩
-e, --enable-binlog. # 主从同步中, 导入数据开启 binlog 记录, 可同步到 slave
-o, --overwrite-tables # 先 drop, 再写入
-d, --directory # 指定恢复数据目录
-s, --source-db # 指定恢复库名
-B, --database # 指定恢复的库
# 比如我导出的库包括 DB_A, DB_B, DB_C, 希望将 DB_C 恢复为 DB_D,则 -s DB_C -B DB_D
--set-names utf8mb4 # 设置字符集
-T, --tables-list
-x, --regex
--skip-triggers # 不导入 triggers
--skip-post # 不导入 events
--no-data # 不导入 数据
mydumper.conf
[mydumper]
user = root
password = xxx
[myloader]
user = root
password = xxx
omit.conf
# 指定 thc_1093_his.a_log,thc_1093_his.b_log 两张表不进行备份
thc_1093_his.a_log
thc_1093_his.b_log
# 指定用户名、密码、host、port,开启协议压缩,启动8线程,每个sql不限制行数,单行宽度限制10M,指定备份 thc_1093_his 库,指定字符集 utf8mb4,需要备份 routine,默认会备份视图,跳过 definer 记录,开启单事务备份,输出到 thc_1093_his 目录,sql 文件压缩存储
mydumper \
# -u root -p password \
--defaults-file ./mydumper.conf -O ./omit.conf \ # mydumper.conf 中配置账号密码,omit.conf 配置跳过的 db.table
-C -t 8 -s 10000000 --set-names utf8mb4 -R --skip-definer --trx-consistency-only -c \ # 这行是基本不变的配置
-h 192.168.248.75 -P 4001 -B thc_1093_his \ # 指定实例IP,实例端口,备份库(指定表或正则参考 -T 或 -x 参数)
-o ./thc_1093_his # 输出位置
# 导入, 指定用户名、密码、host、port,压缩链接,开启4线程导入,不限制行, 导入同时记录binlog, 如果表存在则先drop,备份目录指定为 back_dir,指定特定库 thc_6009_bjlha, 并还原到新库 yang(还原到原库名则不需要指定)
myloader -u root -p password -h 192.168.248.81 -P 5111 -C \
-t 4 \
-r 0 \
-e -o \
-d ./back_dir -s thc_1093_his -B yang
- matedata # 文件内容(包括所有备份内容的checksum值)
- .sql # 数据
- .schema.sql #
- .
测试环境
测试主机配置信息: 16C 64G
数据大小:130G(备份后大小12G)
导出测试
mysqldump | mydumper(4 thread) | mydumper(8 thread) | |
---|---|---|---|
时间对比 | 55min | 25min 可能是由于每个线程的IO没有长时间占用,所以4线程和8线程差距不大 |
23min 1.锁相关:默认参数,–less-locking, --trx-consistency-only 不同参数备份差距不大 2. --rows 可以适当减少单个文件块的行数,提高效率可以到20分钟内 |
资源对比 | - | 400%(内存无大量占用) | 800%(内存无大量占用) |
导入测试
mysqldump | mydumper(4 thread) | mydumper(8 thread) | |
---|---|---|---|
时间对比 | 2h30min | 1h50m | 2h10min |
默认
主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,以阻止DML语句写入,保证数据的一致性
读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用
N个(线程数可以指定,默认是4)dump线程 START TRANSACTION WITH CONSISTENT SNAPSHOT; 开启读一致的事务
dump non-InnoDB tables, 首先导出非事务引擎的表
主线程 UNLOCK TABLES 非 事务引擎备份完后,释放全局只读锁
dump InnoDB tables, 基于 事务导出InnoDB表
事务结束
–less-locking
主线程 FLUSH TABLES WITH READ LOCK (全局锁)
Dump线程 START TRANSACTION WITH CONSISTENT SNAPSHOT;
LL Dump线程 LOCK TABLES non-InnoDB (线程内部锁)
主线程 UNLOCK TABLES
LL Dump线程 dump non-InnoDB tables
LL DUmp线程 UNLOCK non-InnoDB
Dump线程 dump InnoDB tables