整表复制
背景
最近在做公司内部的一个运营平台功能:主要是运营上传excel,然后解析这个excel得到目标表(其中还包括各种各样的校验逻辑。),再将这个目标表推送到生产环境。
时序图
整表推送方案
1. 传统的insert
在prod上新建一个和待传送的目标表结构一模一样的表,然后通过insert来完成整表复制。
缺点:数据量是百万级别的,insert需要30s左右,传输效率低下。
2. mydumper
在调研其它方式的过程中,知道了mydumper这种方式。
简单介绍下:
特点
- 高效性:mydumper 采用多线程方式进行数据备份,能够显著提高备份速度,尤其对于大规模数据库,其性能优势更为明显。例如,在备份一个包含多个大型表的数据库时,它可以同时处理多个表的备份,大大缩短了整体备份时间。
- 灵活性:支持多种备份选项,如全量备份、增量备份、按表备份、按数据库备份等。用户可以根据实际需求选择不同的备份策略。比如,只需要备份某个特定的表,或者在进行全量备份后,后续只进行增量备份以节省时间和存储空间。
- 数据一致性:在备份过程中,能够确保数据的一致性。它通过获取数据库的一致性快照来实现这一点,即使在备份过程中有数据的插入、更新或删除操作,也能保证备份数据的完整性和准确性。
- 恢复方便 :与 myloader 工具配合使用,恢复数据非常便捷。可以将备份文件快速、准确地恢复到 MySQL 数据库中,并且支持在恢复过程中进行一些参数配置,如指定恢复的数据库、表等。
工作原理
mydumper 通过连接到 MySQL 数据库,利用 MySQL 的复制功能和事务机制来获取数据的一致性快照。它首先创建一个全局只读锁,以确保在获取元数据时数据的一致性。然后,它会多线程地读取数据并将其输出到文件中。在备份过程中,会记录下二进制日志的位置,以便进行增量备份或在恢复时确保数据的一致性。
应用场景
- 数据库备份:适用于各种规模的 MySQL 数据库备份,无论是小型企业数据库还是大型互联网公司的数据库集群,都可以使用 mydumper 进行高效、可靠的备份。
- 数据迁移:在进行数据库迁移时,可以使用 mydumper 将数据从一个 MySQL 服务器备份出来,然后通过 myloader 将数据加载到另一个 MySQL 服务器上,实现数据的快速迁移。
- 灾难恢复:作为灾难恢复计划的一部分,定期使用 mydumper 进行备份可以在数据库出现故障、数据丢失或损坏等情况下,快速恢复数据,减少业务中断时间。
mydumper 的使用
百万级数据传输速度是:6s 左右,相比传统的insert分页插入快了很多。
安装mydumper
我测试的是centos,试过ubuntu是可以直接用apt install mydumper的.
wget github.com/mydumper/my...
rpm -ivh mydumper-0.18.2-3.el7.x86_64.rpm
缺少依赖执行这个:
sudo yum install -y pcre2
备份表
使用 mydumper
备份指定表时,主要通过 -T
选项来指定要备份的表,多个表之间用逗号分隔。基本的命令格式如下:
mydumper -h <主机名> -u <用户名> -p <密码> -T <数据库名.表名1,数据库名.表名2,...> -o <备份文件输出目录>
使用:
mydumper -h localhost -u root -p 'rootA1234;' -T test.test_table -o /bak/test_table
恢复表
基本的恢复命令格式如下:
xml
myloader -h <主机名> -u <用户名> -p <密码> -B<指定恢复到哪个库里> -d <备份文件目录>
将虚拟机上的数据库表数据,恢复到我宿主机上,使用:
myloader -h 192.168.7.111 -u root -p 123456 -d /bak/test_table
myloader -h 192.168.7.111 -u root -p 123456 -B auto_pm -d /bak/test_table
如果指定的auto_pm库里有待恢复表,就会报错,恢复不成功。
备份库
若只想备份特定的某个数据库,可以使用 -B
参数指定数据库名称。
mydumper -h -u -p -B <database_name> -o <output_directory> --less-locking
使用:
mydumper -h localhost -u root -p 'rootA1234;' -B test -o /bak/test_db --trx-tables
恢复库
恢复格式:
myloader -h <主机名> -u <用户名> -p <密码> -B<指定的数据库名> -d <备份文件目录>
将虚拟机上备份出来的数据库恢复到宿主机上指定的数据库里,使用:
myloader -h 192.168.7.111 -u root -p 123456 -B auto_pm -d /bak/test_db
window 系统怎么办?
很不幸的是mydumper只能依赖于linux内核,所以没有window版本的。
可是开发机器是window系统,那么怎么测试呢?
折腾挺久的,这里直接记录下答案:WSL
参考链接:全网最全Win10/11系统下WSL2+Ubuntu20.04的全流程安装指南(两种支持安装至 D 盘方式)_win10 wsl2安装-CSDN博客
在wsl里安装mydumper,然后在宿主机上使用wsl里的mydumper即可,使用方式如下
备份表
将7.111上的auto_pm库下的test_table表备份到路径/mnt/....../下
wsl mydumper -h 192.168.7.111 -u root -p 123456 -T auto_pm.test_table -o /mnt/d/soft/mydumper/bak/1
恢复表
将/mnt/....../下的备份文件恢复到195.140上的test库里
wsl myloader -h 192.168.195.140 -u root -p 'rootA1234;' -B test -d /mnt/d/soft/mydumper/bak/1
rsync
wsl rsync -avzP /mnt/d/soft/mydumper/bak/1/ /mnt/d/soft/mydumper/bak/3
总结
- 调研了mydumper这种支持整表传输的方式。
- 调研了在window上支持使用mydumper的方式。