MySQL 数据库如何使用 mydumper 和 myloader 数据快速备份和迁移

本文最后更新于 2025年5月17日 下午

当我们需要备份或者迁移大量 MySQL 数据时,可以使用 mydumper 和 myloader 工具进行快速备份和迁移。尤其是跨服务器迁移或者是本地数据库上云的时候,更快速地且稳定地完成数据迁移。

相比 MySQL/MariaDB 自带的 mysqldump(mariadump) 工具,mydumper 和 myloader 更加高效,且支持多线程备份和多线程恢复,可以大大缩短备份和迁移的时间

别再打开 DBeaver、Navicat 或者 DataGrip 等数据库管理工具来两库对拷了

哈哈,应该有不少人是这样做的吧 ~

mydumper

mydumper 开源的 MySQL 数据库逻辑备份工具,GitHub 开源地址:mydumper/mydumper。包含两个组件:

  • mydumper​​: 负责导出 MySQL 数据库的一致性备份。
  • myloader​​: 读取 mydumper 生成的备份文件,连接目标数据库并执行导入.

相比于 MySQL 自带的 mysqldump 工具,主要的优势:

  • 多线程处理: 支持多线程备份,备份速度更快;同时使用事务快照,减少锁争用,降低对生产环境的影响。
  • 配置灵活: 支持正则表达式过滤表,支持压缩备份,支持长查询处理,支持导出 CSV 文件等。

效果演示

举个例子,我这里有一个使用 MariaDB 官方 Docker 镜像部署的数据库。数据量大概有 300 万条记录,大小 2.5G 左右。MariaDB 的镜像是基于 Ubuntu 24 的:

MariaDB 数据库 Docker 镜像

直接安装:

1
2
3
4
5
6
7
8
9
10
11
12
# 进入容器
docker exec -it mariadb /bin/bash
# 更新软件包
apt update && apt upgrade -y
# 安装 wget 用来下载 mydumper
apt install wget -y
# 下载 mydumper
wget https://github.com/mydumper/mydumper/releases/download/v0.19.1-3/mydumper_0.19.1-3.bookworm_amd64.deb
# 安装 mydumper
apt install ./mydumper_0.19.1-3.bookworm_amd64.deb
# 查看 mydumper 版本
mydumper --version

然后全数据库(剔除系统和测试库)全量备份,使用如下命令:

1
mydumper -u root -p '@******#' -t 4 --compress --regex '^(?!(mysql\.|sys\.|test\.))' -o /var/backups/fullMariaDB -v 3

大概解释以下命令构成,在没有指定远程地址情况默认为本地数据库:

  • -t 4: 使用 4 个线程进行备份。
  • –compress: 使用 gzip 压缩备份文件。
  • –regex ‘^(?!(mysql.|sys.|test.))’: 使用正则表达式过滤表,只备份除了 mysql、sys、test 之外的表。
  • -o /var/backups/fullMariaDB: 备份文件输出到 /var/backups/fullMariaDB 目录下。
  • -v 3: 输出详细日志,包括成功的 info 级别日志。

mydumper 全量备份

腾讯云的轻量数据库,性能比 Docker 容器好很多,而且不需要我关注云备份和灾备;所以我想把备份文件迁移到腾讯云的轻量数据库上:

腾讯云轻量数据库

如果你也想使用腾讯云的轻量数据库,特别是同地域的轻量应用数据库和轻量服务器是内网互联的;那么你可以使用博客的专属链接购买体验:

你也可以使用我的专属链接购买,看看有没有你需要的云产品资源:

使用配套的 myloader 工具,将备份文件导入到腾讯云的轻量数据库上:

1
myloader -u root -p '4**********O' -h 10.0.4.15 -o --regex '^(?!(mysql\.|sys\.|test\.))' -d /var/backups/fullMariaDB -v 3

相比备份时候使用的mydumper,这次添加-h参数,指定远程地址:

  • -h 10.0.4.15: 指定远程地址为腾讯云轻量数据库的 IP 地址。
  • -d /var/backups/fullMariaDB: 指定备份文件目录。
  • -o: 如果目标数据库已经存在,那么进行覆盖。

数据迁移完成

支持创作

制作教程不易,如果热心的小伙伴,想支持创作,可以加入我们的电圈(还可以解锁远程协助、好友位😃):

WebChart Recognise

志同道合的小伙伴也是知音难觅。

  • 开发者爱好群: 👉 如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习(目前可能就我一个人?🤔,毕竟才刚刚创建~)。
QQ_Group Recognise

当然,也欢迎在B站、YouTube或微信公众号上关注我们:

MintimateBlog Recognise

更多:

如何安装

安装方法非常简单。Ubuntu 的软件包管理器可以直接下载(但是可能版本比较旧)。其他系统可以在 Mydumper 的 Release 内下载dpkgrpm包安装:

mydumper 安装包

比如: 在 Debian 12 上安装 mydumper 0.19.1-3:

1
2
3
4
5
6
# 下载 AMD64 版本的 mydumper
wget https://github.com/mydumper/mydumper/releases/download/v0.19.1-3/mydumper_0.19.1-3.bookworm_amd64.deb
# 安装
apt install ./mydumper_0.19.1-3.bookworm_amd64.deb
# 查看版本
mydumper --version

如果是在 macOS 上使用,可以使用 Homebrew 安装:brew install mydumper

另外,如果你的数据库是远程地址,本地没有 MySQL 的客户端;那么其实更建议拉取一个基于 MySQL 的 Docker 镜像并安装 mydumper;

最后备份的数据可以直接用 myloader 导入其他 MySQL 内,也可以直接用 docker cp 取出:

flowchart LR
    A[🏢 无本地MySQL] -->|使用Docker方案| B[🐳 拉取MySQL镜像]
    B --> C[🚀 启动并进入容器]
    C --> D[📦 安装工具\n<code>apt update && \ \n apt install mydumper</code>]
    D --> E{🔀 处理方式}
    
    E -->|直接导入| F[🔄 使用myloader\n<code>myloader -h 目标服务器</code>]
    E -->|本地保存| G[💾 导出备份文件\n<code>docker cp 容器ID:/backup .</code>]
    
    style A fill:#f9f,stroke:#333
    style B fill:#90caf9,stroke:#333
    style C fill:#80deea,stroke:#333
    style D fill:#a5d6a7,stroke:#333
    style E fill:#ffe082,stroke:#333
    
    linkStyle 4,5 stroke:#666,stroke-width:2px,stroke-dasharray:5
        class A,B,C,D,E,F,G icon

使用方法

权威的使用方法,可以参考:

比较重要的参数:

参数 说明 参数 说明
-h, --host 数据库主机地址 -u, --user 数据库用户名
-p, --password 数据库密码 -P, --port 数据库端口
-S, --socket UNIX域套接字文件 -o, --outputdir 输出目录
-t, --threads 线程数(默认4) -v, --verbose 输出详细程度,0: 无输出, 1: 错误, 2: 警告, 3 = 详细, 默认 2
-B, --database 指定数据库(逗号分隔) -T, --tables-list 指定表(逗号分隔)
-x, --regex 正则匹配db.table格式 --where WHERE条件过滤数据
-i, --ignore-engines 忽略的存储引擎 -O, --omit-from-file 从文件读取忽略列表
-F, --chunk-filesize 分割文件大小(MB) -r, --rows 按行数分割表数据
-c, --compress 压缩格式(GZIP/ZSTD) -l, --long-query-guard 查询超时时间(秒)
-m, --no-schemas 不备份表结构 -d, --no-data 只备份结构
-x, --regex 正则匹配需要备份的表 --partition-regex 正则匹配需要备份的分区

这里主要说一下使用场景,假设都是本地数据库,端口 3306:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 备份指定表(指定数据库和表)
mydumper -u root -p Mintimate -B db1 -T tb1,tb2 -o /var/backups/
# 只备份表结构
mydumper -u root -p Mintimate -d -B db1 -o /var/backups/
# 不转储 mysql、sys 和 test 数据库(迁移常用)
mydumper -u root -p Mintimate --trx-tables --regex '^(?!(mysql\.|sys\.|test\.))' -o /var/backups/
# 仅转储 mysql 和 test 数据库
mydumper -u root -p Mintimate --trx-tables --regex '^(mysql\.|test\.)' -o /var/backups/
# 不转储以 test 开头的所有数据库
mydumper -u root -p Mintimate --trx-tables --regex '^(?!(test))' -o /var/backups/
# 转储不同数据库中的特定表
mydumper -u root -p Mintimate --trx-tables --regex '^(edumsdb\.el_edums_data_push_config$|externaldb\.authorization_token_info$)' -o /var/backups/
# 转储几个数据库,但要丢弃一些表
mydumper -u root -p Mintimate --trx-tables --regex '^(?=(?:(edumsdb\.|externaldb\.)))(?!(?:(edumsdb\.el_edums_data_push_config$|externaldb\.authorization_token_info$)))' -o /var/backups/

对应的 myloader 恢复命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 恢复制定数据库
myloader -u root -p Mintimate -s db1 -o -d /var/backups/
# 恢复指定数据库到制定数据库
myloader -u root -p Mintimate -s db1 -B db_target -o -d /var/backups/
# 恢复指定数据库的表到制定据库内
myloader -u root -p Mintimate -s db1 -T db1.tb1,db1.tb2 -B db_target -o -d /var/backups/
# 全量恢复
myloader -u root -p Mintimate -o -d /var/backups/
# 全量结构恢复
myloader -u root -p Mintimate -o --no-data -d /var/backups/
# 使用正则排除制定数据库
myloader -u root -p Mintimate -o --regex '^(?!(mysql\.|sys\.|test\.))' -d /var/backups/

比如: 恢复 umami 数据库内的 website 表结构到远程服务器上的 umami_mirror 数据库内:

myloader 恢复指定表结构

END

本文主要介绍了如何使用 mydumper 和 myloader 工具进行数据库的备份和恢复,以及如何使用 mydumper 进行增量备份。

另外,如果有小伙伴出现 MariaDB 迁移到 MySQL 8.x,遇到: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'。这是因为 MySQL 8.x 移除了NO_AUTO_CREATE_USER。你可以执行这段来修复:

1
find /var/backups/fullMariaDB/ -type f -name "*.sql" -print0 | xargs -0 sed -i "s/NO_AUTO_CREATE_USER,//g"

希望本文能帮助到大家,如果大家有更好的方法,欢迎留言交流。



MySQL 数据库如何使用 mydumper 和 myloader 数据快速备份和迁移
https://www.mintimate.cn/2025/05/17/mysqlMigrationByDumper/
作者
Mintimate
发布于
2025年5月17日
许可协议