整表复制

整表复制

背景

最近在做公司内部的一个运营平台功能:主要是运营上传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

总结

  1. 调研了mydumper这种支持整表传输的方式。
  2. 调研了在window上支持使用mydumper的方式。
相关推荐
iRayCheung26 分钟前
Docker安装的mysql限制ip访问
tcp/ip·mysql·docker
raoxiaoya1 小时前
同时安装多个版本的golang
开发语言·后端·golang
rainFFrain2 小时前
(MySQL)库的操作
数据库·mysql
此木|西贝2 小时前
【设计模式】享元模式
java·设计模式·享元模式
考虑考虑3 小时前
go使用gorilla/websocket实现websocket
后端·程序员·go
李少兄3 小时前
解决Spring Boot多模块自动配置失效问题
java·spring boot·后端
bxlj_jcj4 小时前
JVM性能优化之年轻代参数设置
java·性能优化
八股文领域大手子4 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
不当菜虚困4 小时前
JAVA设计模式——(八)单例模式
java·单例模式·设计模式