mysql - 备份恢复工具 mydumper


介绍

部署安装

# 当前最新 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)

  • 导出测试

    mysqldumpmydumper(4 thread)mydumper(8 thread)
    时间对比55min25min
    可能是由于每个线程的IO没有长时间占用,所以4线程和8线程差距不大
    23min
    1.锁相关:默认参数,–less-locking, --trx-consistency-only 不同参数备份差距不大
    2. --rows 可以适当减少单个文件块的行数,提高效率可以到20分钟内
    资源对比-400%(内存无大量占用)800%(内存无大量占用)
  • 导入测试

    mysqldumpmydumper(4 thread)mydumper(8 thread)
    时间对比2h30min1h50m2h10min

补充

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瓶颈

相关链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值