mydumper/myloader 云数据库迁移完整操作手册
适用场景:华为云 RDS for MySQL → 阿里云 RDS for MySQL 数据迁移
数据规模:50GB 生产库,华为云磁盘空间53.52GB, 数据空间50.117 GB
核心优势:多线程并行,速度是mysqldump的 5~10 倍
文档版本:v4.6(实战验证版,关键节点计时精简版)
更新日期:2026-07-21
一、版本选择与安装
1.1 如何选择正确的安装包
mydumper 的 GitHub Release 提供多种打包格式,选择依据如下:
| 文件名后缀 | 含义 | 适用系统 |
|---|---|---|
el7 |
Enterprise Linux 7 | CentOS 7 / RHEL 7 / Rocky Linux 7 |
el8 |
Enterprise Linux 8 | CentOS 8 / RHEL 8 / Rocky Linux 8 / AlmaLinux 8 |
el9 |
Enterprise Linux 9 | CentOS 9 / RHEL 9 / Rocky Linux 9 / AlmaLinux 9 |
amd64 / x86_64 |
x86_64 架构 | 绝大多数 Intel/AMD 服务器 |
arm64 / aarch64 |
ARM 架构 | 华为云鲲鹏、阿里云倚天等 ARM 实例 |
选择原则:
- 先确定中转服务器的操作系统版本(
cat /etc/os-release)和 CPU 架构(uname -m) - 选择对应的组合包,例如:CentOS 7 + x86_64 → 选
mydumper-1.0.3-1.el7.x86_64.rpm - Ubuntu 22.04/24.04(x86_64)→ 选
mydumper_1.0.3-1.bookworm_amd64.deb
1.2 安装步骤
CentOS / RHEL / Rocky Linux
# 以 CentOS 7 x86_64 为例
wget https://github.com/mydumper/mydumper/releases/download/v1.0.3-1/mydumper-1.0.3-1.el7.x86_64.rpm
# 安装 pcre2 依赖(必须,否则会报错)
sudo yum install -y pcre2-devel
# 安装 mydumper
sudo rpm -ivh mydumper-1.0.3-1.el7.x86_64.rpm
# 若仍有其他依赖问题,可启用 EPEL 仓库后重试
sudo yum install -y epel-release
sudo yum install -y mydumper-1.0.3-1.el7.x86_64.rpm
Ubuntu / Debian
# 以 Ubuntu 22.04 x86_64 为例
wget https://github.com/mydumper/mydumper/releases/download/v1.0.3-1/mydumper_1.0.3-1.bookworm_amd64.deb
sudo apt install ./mydumper_1.0.3-1.bookworm_amd64.deb
验证安装:
mydumper --version # 应显示 v1.0.3
myloader --version
二、创建备份用户(云 RDS 环境)
云数据库(华为云/阿里云 RDS)的账户权限通常受限,需提前创建一个专用备份用户并授予必要权限。
在源库(华为云 RDS)中执行:
-- 创建用户(请替换密码)
CREATE USER 'backup_user'@'%' IDENTIFIED BY 'StrongPassw0rd!';
-- 授予最小必要权限(注意:云 RDS 的 SUPER/BACKUP_ADMIN 权限不可用)
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'%';
FLUSH PRIVILEGES;
重要说明:
REPLICATION CLIENT用于获取 Binlog 位置(云 RDS 可能限制此权限,建议加--source-data=-1跳过)RELOAD和LOCK TABLES在云 RDS 环境通常不可用,通过--sync-thread-lock-mode=SAFE_NO_LOCK规避EVENT权限在云 RDS 上无效(无法访问mysql.event表),需移除--events参数PROCESS用于查看当前连接和线程信息
三、准备配置文件(安全实践)
为避免在命令行中明文暴露账号密码,创建统一的配置文件,mydumper 和 myloader 共用同一格式。
3.1 华为云侧配置文件(mydumper 导出用)
在华为云中转机上创建 /data/mysqlBackup/backup.cnf:
[client]
user=backup_user
password=StrongPassw0rd!
host=192.168.0.116
port=3306
设置安全权限(仅当前用户可读写):
mkdir -p /data/mysqlBackup
chmod 600 /data/mysqlBackup/backup.cnf
说明:
[client]组中的配置会被mydumper自动读取,无需重复添加[mydumper]组。
3.2 阿里云侧配置文件(myloader 导入用)
在阿里云中转机上创建 /data/mysqlBackup/backup.cnf:
[client]
user=目标库账号
password=目标库密码
host=阿里云RDS地址
port=3306
设置安全权限(仅当前用户可读写):
mkdir -p /data/mysqlBackup
chmod 600 /data/mysqlBackup/backup.cnf
说明:
mydumper和myloader的配置文件格式完全一致,仅[client]中的连接信息不同(分别指向源库和目标库)。
四、导出数据(在华为云侧中转机执行)
4.1 线程数(-t)如何选择?
| CPU 核数 | 推荐线程数 | 说明 |
|---|---|---|
| 2 核 | -t 4 |
保守配置 |
| 4 核 | -t 6~8 |
推荐配置(实战验证) |
| 8 核 | -t 12~16 |
高性能配置 |
- 云 RDS 受限于磁盘 I/O,线程数过大可能增加竞争,建议从
-t 4开始测试,逐步增加 - 实战验证:4 核中转机使用
-t 6表现稳定
4.2 导出命令与计时
方式一:全库导出(不排除任何表)
场景:导出 hr-prd 数据库的所有表。
正则写法:'^hr-prd\.' 匹配 hr-prd 库下的所有表。
# 创建备份目录
mkdir -p /data/mysqlBackup/dump
# 执行全库导出并计时(time 输出 real/user/sys)
echo "=== 导出开始: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
time mydumper \
--defaults-extra-file=/data/mysqlBackup/backup.cnf \
-t 6 \
--regex '^hr-prd\.' \
--triggers \
--routines \
--source-data=-1 \
--sync-thread-lock-mode=SAFE_NO_LOCK \
-c \
-o /data/mysqlBackup/dump \
2>&1 | tee -a /data/mysqlBackup/time.log
echo "=== 导出结束: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
方式二:排除部分表后导出(按需过滤)
场景:导出 hr-prd 数据库,但排除特定日志表、所有 _copy 表(白名单除外)。
正则写法:'^hr-prd\.(?!aut_audit_log|aut_authication_log|hr_log|opr_operation_log|sys_log|(?!(org_enterprise_copy|org_employee_copy_ent)).*_copy).*'
echo "=== 导出开始: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
time mydumper \
--defaults-extra-file=/data/mysqlBackup/backup.cnf \
-t 6 \
--regex '^hr-prd\.(?!aut_audit_log|aut_authication_log|hr_log|opr_operation_log|sys_log|(?!(org_enterprise_copy|org_employee_copy_ent)).*_copy).*' \
--triggers \
--routines \
--source-data=-1 \
--sync-thread-lock-mode=SAFE_NO_LOCK \
-c \
-o /data/mysqlBackup/dump \
2>&1 | tee -a /data/mysqlBackup/time.log
echo "=== 导出结束: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
计时说明:
time命令会输出real(总耗时)、user(用户态CPU时间)、sys(内核态CPU时间)- 所有输出(包括
time的输出)通过2>&1 | tee -a追加到time.log,便于汇总各阶段耗时
4.3 正则表达式场景速查
| 需求 | 正则写法 |
|---|---|
| 全库导出(所有表) | --regex '^hr-prd\.' |
| 只备份特定表(如 orders, users, products) | --regex '^hr-prd\.(orders|users|products)$' |
| 排除特定表(如 log_table, temp_data) | --regex '^hr-prd\.(?!log_table|temp_data).*' |
排除特定表 + 排除所有含 _copy 的表(白名单保留) |
--regex '^hr-prd\.(?!aut_audit_log|...|(?!(org_enterprise_copy|org_employee_copy_ent)).*_copy).*' |
使用单引号包裹正则表达式,避免
!和|被 Shell 解释。
4.4 ⚠️ 关于 --events 的重要说明
| 参数 | 是否可用 | 原因 |
|---|---|---|
--triggers |
✅ 可用 | 从 information_schema 获取 |
--routines |
✅ 可用 | 从 information_schema 获取 |
--events |
❌ 不可用 | 需访问 mysql.event 表,普通用户无权限 |
替代方案:迁移后手动重建事件(查询源库 SHOW CREATE EVENT 后在目标库执行)。
4.5 ⚠️ 关于锁参数
在云 RDS 环境,推荐使用 --sync-thread-lock-mode=SAFE_NO_LOCK 来避免全局锁,同时通过 Binlog 位置校验一致性,这是最安全的方式。
若版本不支持
SAFE_NO_LOCK,可改用NO_LOCK,但需确保已停止写入。
4.6 Shell 转义提醒
始终用单引号包裹正则表达式,例如:--regex '^hr-prd\.(?!log).*',避免 ! 被 bash 解释。
五、打包压缩与文件校验(华为云侧)
# 进入备份父目录
cd /data/mysqlBackup
# 记录打包开始时间
echo "=== 打包开始: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
# 执行打包并计时
time tar -czvf dump_$(date +%Y%m%d_%H%M%S).tar.gz dump/ 2>&1 | tee -a /data/mysqlBackup/time.log
# 生成 MD5 校验文件
md5sum dump_*.tar.gz > dump_$(date +%Y%m%d).tar.gz.md5
# 记录打包结束时间
echo "=== 打包结束: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
六、跨云传输(华为云 → 阿里云)
根据网络条件选择传输方式,并在传输前后记录时间。
方式一:rsync(支持断点续传,推荐)
# 记录传输开始时间
echo "=== 传输开始: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
# 执行传输并计时
time rsync -avzP --progress -e "ssh -p 22" \
/data/mysqlBackup/dump_20260721_143022.tar.gz \
root@{阿里云中转机IP}:/data/mysqlBackup/ 2>&1 | tee -a /data/mysqlBackup/time.log
# 记录传输结束时间
echo "=== 传输结束: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
方式二:scp(简单直接)
echo "=== 传输开始: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
time scp /data/mysqlBackup/dump_20260721_143022.tar.gz root@{阿里云中转机IP}:/data/mysqlBackup/ 2>&1 | tee -a /data/mysqlBackup/time.log
echo "=== 传输结束: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
方式三:对象存储中转(跨云网络不稳时)
可使用 OSS/OBS 中转,计时方式类似(上传 + 下载两步)。
七、解压与校验(阿里云侧中转机)
# 进入目标目录
mkdir -p /data/mysqlBackup
cd /data/mysqlBackup
# 校验 MD5(与源端对比)
md5sum dump_20260721_143022.tar.gz
# 解压(时间计入导入准备,可选记录)
time tar -xzvf dump_20260721_143022.tar.gz
myloader支持直接读取.sql.gz,无需解压每个文件。
八、导入前准备(阿里云 RDS)
-- 删除并重建目标库(确保无表冲突)
DROP DATABASE IF EXISTS `hr-prd`;
CREATE DATABASE `hr-prd` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
九、导入数据(在阿里云侧中转机执行)
# 记录导入开始时间
echo "=== 导入开始: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
# 执行导入并计时
time myloader \
--defaults-extra-file=/data/mysqlBackup/backup.cnf \
-t 6 \
-d /data/mysqlBackup/dump \
--overwrite-unsafe \
--enable-binlog \
2>&1 | tee -a /data/mysqlBackup/time.log
# 记录导入结束时间
echo "=== 导入结束: $(date '+%Y-%m-%d %H:%M:%S') ===" >> /data/mysqlBackup/time.log
参数说明:
--overwrite-unsafe:覆盖已有表(v1.0.3 兼容)--enable-binlog:确保 Binlog 写入,保证主备同步(1主2备架构必须)- 导入后的 WARNING(如
SET SESSION SQL_LOG_BIN权限不足)可安全忽略,因为云 RDS 无 SUPER 权限反而保证了 Binlog 正常写入。
十、数据验证与清理
10.1 数据验证
# 检查表数量
mysql -h {阿里云RDS} -u {账号} -p -e "USE \`hr-prd\`; SHOW TABLES;" | wc -l
# 对比关键表行数(与源库对比)
mysql -h {阿里云RDS} -u {账号} -p -e "USE \`hr-prd\`; SELECT COUNT(*) FROM {关键表};"
# 检查存储过程/函数
mysql -h {阿里云RDS} -u {账号} -p -e "SHOW PROCEDURE STATUS WHERE Db='hr-prd';"
mysql -h {阿里云RDS} -u {账号} -p -e "SHOW FUNCTION STATUS WHERE Db='hr-prd';"
10.2 查看各阶段耗时
cat /data/mysqlBackup/time.log
日志中记录了:
- 导出开始/结束时间
time mydumper的输出(real, user, sys)- 打包开始/结束时间及
time tar输出 - 传输开始/结束时间及
time rsync/scp输出 - 导入开始/结束时间及
time myloader输出
10.3 清理临时文件
# 华为云中转机
rm -rf /data/mysqlBackup/dump /data/mysqlBackup/dump_*.tar.gz /data/mysqlBackup/backup.cnf /data/mysqlBackup/time.log
# 阿里云中转机(确认导入成功后)
rm -rf /data/mysqlBackup/dump /data/mysqlBackup/dump_*.tar.gz /data/mysqlBackup/backup.cnf /data/mysqlBackup/time.log
十一、常见问题处理
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
安装时报 pcre2 is needed |
缺少依赖 | sudo yum install -y pcre2-devel |
Unknown option --no-locks |
旧版本 | 改用 --sync-thread-lock-mode=SAFE_NO_LOCK |
Couldn't acquire LOCK INSTANCE FOR BACKUP |
云 RDS 无 BACKUP_ADMIN |
添加 --sync-thread-lock-mode=SAFE_NO_LOCK |
Error showing events on: mysql - ERROR 1044 |
无 mysql 库权限 |
去掉 --events,手动重建 |
目录只有 2 个文件,无 .sql.gz |
正则匹配失败或库名错误 | 检查正则和数据库名 |
Unknown option --overwrite-tables |
v1.0.3 不支持 | 改用 --overwrite-unsafe |
Table already exists |
目标库已有表 | 导入前 DROP DATABASE 重建 |
Shell 报 ! 相关错误 |
正则被解释 | 用单引号包裹正则 |
十二、性能参考(基于 50GB 生产库实测)
| 步骤 | 线程数 | 耗时范围 | 实际耗时 | 说明 |
|---|---|---|---|---|
| 导出(mydumper) | 6 | 30~45 分钟 | 7m35.761s | 取决于源库 I/O 和表复杂度 |
| 打包(tar.gz) | - | 5~10 分钟 | 1m57.501s | 压缩率影响耗时 |
| 传输(千兆网络) | - | 10~15 分钟 | 51m5.695s | 受跨云带宽影响 |
| 导入(myloader) | 6 | 20~35 分钟 | 4m54.647s | 受目标库 IOPS 影响 |
| 总计 | - | 约 65~105 分钟 | 70分钟 | 建议预留 2 小时窗口 |
华为云阿里云服务器宽带都是10M,传输时间和预计相差很大
华为云磁盘空间53.52GB, 数据空间50.117 GB,有其他数据库但数据不多
打包(tar.gz)文件大小为3.5G
导入阿里云后磁盘空间45.05G,数据空间30.13G,基于增长统计
实际耗时可能因环境而异,建议提前在测试环境演练。
文档名称:mydumper_myloader_cloud_migration_guide.md
版本:v4.6(实战验证版,关键节点计时精简)
更新日期:2026-07-21
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)