30GB的库用mysqldump迁了快2个小时还丢了一个触发器,换成DataX+Shell脚本200多张表一个下午跑完,批量迁移工具到底怎么选
上个月公司服务器迁移,要把60多个MySQL数据库从一个机房搬到另一个机房,总共大约400张表、300多GB的数据。我第一反应是用mysqldump写个脚本批量导,结果第一个30GB的库就卡住了——导出40分钟,导入1小时,更要命的是导入后发现定时任务不跑,排查半天才发现存储过程和触发器压根没迁过来。最后换成了DataX加Shell脚本的方案,一个下午把200多张表全部跑完。这次经历让我意识到,数据库批量迁移这件事,工具选型和"会写SQL"是两回事。
先看你的迁移场景属于哪一种
| 1 | 同构迁移(MySQL→MySQL、PG→PG)→ mysqldump/pg_dump 小库够用,DataX 大库首选,KFS 要不停机就它 |
| 2 | 异构迁移(MySQL→PG、Oracle→MySQL)→ pgloader(MySQL→PG首选)、DataX(多源多目标)、云DMS(上云专用) |
| 3 | 批量多库/多表(几十上百个库一次迁)→ DataX + Shell脚本 或 Kettle + 图形化拖拽,纯手动是自虐 |
| 4 | 零停机迁移(业务不能停)→ KFS/AWS DMS 基于binlog增量同步,mysqldump/DataX这种离线工具直接排除 |
四种场景对应完全不同的工具选择逻辑。用mysqldump去迁300GB的大库、用DataX去迁需要零停机的金融系统、用Navicat去批量迁几十个库——这些坑我都踩过,每一个的代价都是加班到凌晨。下面按工具逐个说清楚。
一、mysqldump/pg_dump:够简单但不够能打
mysqldump是MySQL自带的逻辑备份工具,优点就一个字:稳。不需要安装任何额外软件,随便一台装了MySQL的服务器就能跑。对于50GB以下的小库、同版本MySQL之间的迁移,mysqldump是最省心的选择。
但它的硬伤也很明显:不支持增量同步。导出过程中如果有新数据写入,这些数据不会被包含在导出的SQL文件里。迁移完成后切换流量,中间这段时间的新增数据需要另外处理。更大的问题是速度——30GB的库导出40分钟、导入1小时,这还是网络状况好的情况。
还有两个容易被忽略的坑。一个是存储过程和触发器默认不导出,必须手动加 -R 和 --triggers 参数。另一个是字符集——源库是 utf8mb4,目标库是 utf8,迁移完emoji全变成问号。pg_dump(PostgreSQL对应工具)的逻辑类似,适合PG同构小库迁移,但跨数据库类型就无能为力了。

mysqldump适用条件:50GB以内、同版本MySQL、允许停机窗口、不需要增量同步。超过这个范围,别硬用,换工具。
二、DataX:批量迁移的"瑞士军刀",但上手成本你得有心理准备
DataX是阿里开源的数据同步框架,最大的优势是多数据源支持和批量处理能力。MySQL、Oracle、PostgreSQL、SQL Server、HDFS、Hive、HBase……几乎所有主流数据源都能互相同步。而且它的并行处理引擎效率极高,官方数据日均处理300TB以上。
DataX的核心工作方式是JSON配置文件驱动。每张表需要写一个JSON文件,定义Reader(源库连接+表名+字段)和Writer(目标库连接+表名+字段映射)。对于批量迁移,真正的效率在于用Shell脚本自动生成这些JSON——先查出源库所有表名,循环遍历,套模板生成配置,再批量执行。
#!/bin/bash# DataX批量迁移:自动生成所有表的JSON配置并执行SOURCE_HOST="192.168.1.100"TARGET_HOST="192.168.2.100"DB_NAME="my_database"USER="root"PASS="your_password"# 获取源库所有表名TABLES=$(mysql -h$SOURCE_HOST -u$USER -p$PASS $DB_NAME -e "SHOW TABLES;" -N)for TABLE in $TABLES; do# 生成DataX JSON配置cat > /tmp/datax_job_${TABLE}.json <DataX的短板有两个。一是不支持存储过程和触发器迁移,这些需要单独处理。二是本身不支持增量同步,需要配合Canal解析MySQL的binlog才能实现实时增量。如果你需要零停机迁移,DataX单独不够,要搭配其他方案。
三、Kettle:不想写代码的人的批量迁移方案
如果你对命令行和JSON配置感到头大,Kettle(也叫PDI,Pentaho Data Integration)可能是更适合你的选择。它是纯图形化的ETL工具,拖拽组件就能完成数据抽取、转换和加载,不需要写一行代码。
Kettle在处理复杂数据转换时的优势尤其突出。比如从MySQL迁移到PostgreSQL,中间需要做字段类型映射(varchar→text、int→integer、datetime→timestamp)、字符集转换、数据清洗——这些在Kettle里拖几个转换组件就搞定了,DataX需要写UDF自定义函数,mysqldump则完全做不到。
但Kettle在处理超大规模数据时性能会下降。有200多个插件的社区版功能很全,可Java程序的内存占用和GC问题在大数据量场景下会比较明显。通常10GB以下的库用Kettle很舒服,超过50GB建议还是上DataX。
DataX适合谁
会写Shell脚本的运维/开发
批量几十上百张表
数据量大(50GB以上)
不介意写JSON配置
Kettle适合谁
不想写代码的数据分析/DBA
需要复杂数据转换逻辑
数据量中等(10GB以内)
希望可视化操作
四、Navicat / DBeaver / DataGrip:GUI工具的迁移功能,应急够用但不适合批量
Navicat、DBeaver、DataGrip这三款数据库管理工具都有数据传输/迁移功能,操作极其简单:连源库→连目标库→勾选表→点开始。对不熟悉命令行的人来说,这是最低门槛的方案。

但它们的定位是数据库管理工具,不是专业迁移工具。用Navicat迁一个8GB的库,传到一半因为字段类型映射问题报错中断,没有断点续传,只能重头再来。也没有数据校验功能,迁完你不知道数据是不是完整的。DBeaver免费开源,迁移功能更基础,适合临时导几张表到测试环境。DataGrip功能强大但同样不是为批量迁移设计的。
GUI工具的致命伤:没有断点续传、没有数据校验、没有增量同步、不支持批量脚本。临时搬几张表应急可以,作为批量迁移的生产方案是拿业务开玩笑。
五、异构迁移专项:MySQL→PostgreSQL用什么?Oracle→MySQL又用什么?
跨数据库类型的迁移(异构迁移)是所有迁移场景里最麻烦的。不同数据库的字段类型、函数语法、索引机制都不一样,简单的导出导入根本行不通。
MySQL → PostgreSQL:pgloader是首选。它是一个专为PostgreSQL设计的数据加载工具,能自动处理MySQL到PG的类型映射(如int→integer、datetime→timestamp、varchar→text),还支持在加载过程中做数据转换。比mysqldump导出再手动改SQL的效率高出一个数量级。配置文件是声明式的Lisp语法,上手需要一点时间,但一旦配置好,批量处理多个库也很方便。
Oracle → MySQL / SQL Server → MySQL:DataX是最佳选择。DataX的插件体系天然支持异构数据源,MySQL Reader/Writer、Oracle Reader/Writer、SQLServer Reader/Writer各自独立,字段映射通过JSON配置控制。阿里系的很多数据迁移场景就是用DataX在Oracle和MySQL之间搬数据。
上云迁移(本地 → 云数据库):阿里云DMS或AWS DMS。这两个是云服务商提供的托管迁移方案,支持全量+增量、自动处理异构类型映射、有监控面板、支持断点续传。AWS DMS甚至可以在迁移过程中保持源库正常读写,切换时只需短暂中断。但这些都是付费服务,按迁移的数据量和时长计费。
| 迁移方向 | 首选工具 | 类型映射 | 价格 |
|---|---|---|---|
| MySQL → PostgreSQL | pgloader | 自动处理 | 免费 |
| Oracle → MySQL | DataX | JSON配置 | 免费 |
| MySQL → Hive/HDFS | DataX / Sqoop | 需手动指定 | 免费 |
| SQL Server → MySQL | DataX / Kettle | 可视化/JSON | 免费 |
| 本地 → 云数据库 | AWS DMS / 阿里云DTS | 自动处理 | 付费 |
六、零停机迁移:KFS和云DMS的增量同步方案
前面说的mysqldump、DataX、Kettle都是离线迁移——迁移期间源库需要停写或者至少有一个窗口期不能写入新数据。如果业务要求7×24运行,连几分钟的停机窗口都没有,就得用基于binlog的增量同步方案。
KFS(金仓异构数据同步软件)是面向信创场景的商业方案。它的核心机制是:先用KDTS做全量同步,再通过解析源库binlog实现毫秒级增量实时同步。在源库持续写入的情况下,目标库能几乎实时地追平数据。等到两边数据一致时,做一个短暂的流量切换就完成了迁移。有实际案例:传统方案预估48小时的迁移,KFS全量加增量追平只用了不到4小时。
AWS DMS也是类似机制,支持全量加载 + 持续复制两种模式。全量阶段把所有存量数据搬过去,增量阶段通过读取源库的事务日志持续同步变化数据。等两边差距足够小的时候,停机几分钟做最终切换。国内阿里云的DTS(数据传输服务)功能对标AWS DMS,原理一样。
mysqldump迁移30GB
~100分钟
导出40min + 导入60min

DataX批量200张表
~半天
含Shell脚本生成JSON
KFS全量+增量
<4小时
传统方案需48小时
七、批量迁移最容易翻车的四个坑
不管你用哪个工具,下面这四个问题是批量迁移中的高频翻车点,每一个都可能导致迁移完成后发现数据不完整。
字符集不一致
源库utf8mb4,目标库utf8,迁移完用户昵称里的emoji全变??。迁之前第一件事:SHOW VARIABLES LIKE 'character%',确认两端一致。不一致就先改目标库字符集,别等迁完才发现。
存储过程和触发器丢了
mysqldump默认不导出存储过程和触发器,必须加 -R 和 --triggers。DataX完全不支持存储过程迁移。迁移后要单独逐项验证,别等业务报错才知道。
大表一次性导出导致OOM
50GB以上的大表用mysqldump一次性导出,内存直接爆。正确做法是按主键范围切片:--where="id BETWEEN 1 AND 1000000",分批导出再分批导入。
只测全量不测增量
全量迁移完数据一致就以为没问题,上线后发现增量数据漏了。测试阶段必须模拟业务持续写入,验证增量同步能追上。
八、六款工具的完整对比,按你的数据量对号入座
| 工具 | 数据量上限 | 增量同步 | 异构支持 | 批量能力 | 上手难度 | 价格 |
|---|---|---|---|---|---|---|
| mysqldump | < 50GB | 不支持 | 不支持 | 中(脚本) | ★☆☆☆☆ | 免费 |
| DataX | TB级 | 不支持 | ✅ 丰富 | 强(脚本) | ★★★☆☆ | 免费 |
| Kettle | < 50GB | 不支持 | ✅ 丰富 | 中(图形化) | ★★☆☆☆ | 免费 |
| Navicat/DBeaver | < 10GB | 不支持 | 有限 | 弱(手动) | ★☆☆☆☆ | Navicat付费 |
| pgloader | 100GB+ | 不支持 | MySQL→PG专用 | 中(配置) | ★★★☆☆ | 免费 |
| KFS/AWS DMS | TB级 | ✅ 毫秒级 | ✅ 丰富 | 强(平台化) | ★★★☆☆ | 付费 |
九、按你的实际情况选,不用纠结
三个问题决定你该用哪个工具
| Q1 | 数据量多大? 小于10GB偶尔用 → Navicat/DBeaver点几下就行 10-50GB同构 → mysqldump写个脚本跑 50GB以上大批量 → DataX,别用mysqldump硬扛 |
| Q2 | 业务能不能停? 能停机几小时 → mysqldump/DataX/Kettle都行 一分钟不能停 → 只有KFS、AWS DMS、阿里云DTS这种binlog增量方案 |
| Q3 | 是不是跨数据库类型? 同构(MySQL→MySQL)→ mysqldump/DataX MySQL→PG → pgloader Oracle/SQLServer→MySQL → DataX 本地→云 → 云厂商DMS/DTS |
如果你做的是站群或者多站点业务,数据库迁移往往不只是技术问题,还涉及业务连续性。用UC建站系统的内容中台,迁移前可以先把所有站点的数据库结构统一梳理一遍,迁移后通过双通道推送(百度API + IndexNow)快速通知搜索引擎更新抓取,配合独立部署架构,迁移过程中各站点互相不受影响,不会出现一个站挂了拖垮所有站的情况。
说到底,数据库批量迁移没有万能工具。mysqldump够简单但扛不住大库,DataX够能打但配置成本高,Kettle够直观但大数据量会吃力,云DMS够省心但要花钱。核心就一句话:先搞清楚你的数据量、停机窗口、目标库类型,再去对号入座选工具。别像我第一次那样拿mysqldump去硬刚30GB的库,工具没错,是用错了地方。
