文章目录
- 介绍
- 部署安装
- 功能
- 参数详解
- mydumper
- myloader
- 配置文件
- 实际示例
- 操作
- 性能验证
- 补充
- definer
- lock
- 总结
- 相关链接
介绍
部署安装
# 当前最新 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文件中)
-
支持备份视图(备份数据同时备份视图)
-
支持备份存储过程(需要开启参数)
-
支持单独备份表结构(导出参数设置),支持只恢复表结构(导入参数设置)
参数详解
mydumper
# 连接相关
-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
myloader
-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
补充
definer
- 没有 --skip-definer 参数
- 有 --skip-definer 参数
- 使用 root 用户导入,且不对 definer 进行定义(由于不支持指定 definer,如果需要修改,参考链接中有相关内容)
lock
-
默认
-
主线程 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
-
总结
- 由于是多线程操作,如果只有单表大效果不明显,多表大瓶颈转移到磁盘IO
- 建议导入时使用导出线程数设置的一半,同时考虑磁盘IO瓶颈
相关链接
- Github
- MySQL全量数据备份-mydumper | StoneDB
- mydumper安装和使用-蒲公英云
- mysql如何修改所有的definer - 泽锦 - 博客园
- –less-lock 和 --trx-consistency-only