整表复制

整表复制

背景

最近在做公司内部的一个运营平台功能:主要是运营上传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的方式。
相关推荐
无名之逆5 分钟前
轻量级、高性能的 Rust HTTP 服务器库 —— Hyperlane
服务器·开发语言·前端·后端·http·rust
IT成长日记11 分钟前
【binlog2sql实践】MySQL数据库binlog日志ROW格式转换标准SQL
mysql·binlog·row·binlog2sql
无名之逆29 分钟前
探索Hyperlane:用Rust打造轻量级、高性能的Web后端框架
服务器·开发语言·前端·后端·算法·rust
穆骊瑶30 分钟前
Java语言的WebSocket
开发语言·后端·golang
追逐时光者1 小时前
精选 5 款基于 .NET 开源、功能强大的编辑器
后端·.net
程序员沉梦听雨1 小时前
【实战篇】exists语法解析
数据库·mysql
uhakadotcom1 小时前
阿里云 MaxCompute SQLML:轻松实现机器学习
后端·面试·github
小画家~1 小时前
第二:go 链接mysql 数据库
数据库·mysql
Asthenia04121 小时前
[4-Consumer]消费者端实现心跳功能
后端
_君莫笑2 小时前
Ubuntu上部署Flask+MySQL项目
mysql·ubuntu·flask