每天10分钟学会OceanBase系列(Day 7):从MySQL平滑迁移,零停机切换

前6天我们搭建好了OceanBase集群、创建了租户、设计了分区表,现在终于到了最关键的一步------把现有的MySQL业务数据迁移过来。很多团队对迁移心存顾虑,怕停机时间长、怕数据不一致。今天我们就来演示两种最实用的迁移方案,从最简单的 mysqldump 到专业的 DataX,帮你找到最适合自己业务的方式。

方案一:mysqldump(适合中小数据量,10GB以下)

这是最简单粗暴的方式,原理就是把MySQL的数据导出成标准SQL文件,再用 obclient 导入OceanBase。因为OceanBase高度兼容MySQL语法,绝大多数情况下无需修改SQL文件。

复制代码
# 第一步:从MySQL导出数据(带一致性事务快照)
mysqldump -h 192.168.1.1 -uroot -p --single-transaction \
  --set-gtid-purged=OFF --default-character-set=utf8mb4 \
  --databases myapp_db > myapp_db.sql

# 第二步:处理可能的字符集兼容问题(MySQL 8.0常见)
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' myapp_db.sql

# 第三步:导入OceanBase
obclient -h 127.0.0.1 -P 2881 -uroot@my_tenant -D myapp_db -A < myapp_db.sql

⚠️ 避坑提醒 :导入前建议在OceanBase中先执行 SET FOREIGN_KEY_CHECKS = 0; 禁用外键检查,可以大幅提升导入速度。导入完成后再执行 SET FOREIGN_KEY_CHECKS = 1; 恢复。

方案二:DataX(适合大数据量,支持增量同步)

当数据量达到几十GB甚至TB级别时,mysqldump 就不够用了。这时推荐使用阿里巴巴开源的 DataX,它支持断点续传、并发读写,并且可以配置增量同步任务。

首先下载并解压DataX:

复制代码
wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz
tar -xvzf datax.tar.gz

然后编写一个迁移任务配置文件 mysql2ob.json

复制代码
{
  "job": {
    "setting": {
      "speed": { "channel": 4 },
      "errorLimit": { "record": 0, "percentage": 0.1 }
    },
    "content": [
      {
        "reader": {
          "name": "mysqlreader",
          "parameter": {
            "username": "root",
            "password": "your_mysql_password",
            "connection": [
              {
                "table": ["orders", "users"],
                "jdbcUrl": ["jdbc:mysql://192.168.1.1:3306/myapp_db"]
              }
            ]
          }
        },
        "writer": {
          "name": "oceanbasev10writer",
          "parameter": {
            "obWriteMode": "insert",
            "column": ["*"],
            "connection": [
              {
                "jdbcUrl": "jdbc:oceanbase://127.0.0.1:2881/myapp_db",
                "table": ["orders", "users"]
              }
            ],
            "username": "root@my_tenant",
            "password": "your_ob_password",
            "writerThreadCount": 10
          }
        }
      }
    ]
  }
}

执行迁移任务:

复制代码
python datax/bin/datax.py mysql2ob.json

💡 生产迁移最佳实践

无论选择哪种方案,正式迁移前请务必做好以下准备:

  1. 评估数据量:先在小表上测试迁移速度,估算全量迁移所需时间窗口。
  2. 备份源库:迁移前对MySQL做一次完整备份,确保有回滚方案。
  3. 类型兼容性检查 :重点关注 ENUMSETJSON 等特殊类型在OceanBase中的映射关系。
  4. 增量追平:如果停机窗口有限,可以先用DataX做一次全量迁移,然后在切换前再跑一次增量同步,追平差异数据。

今日小结

今天我们掌握了两种从MySQL迁移到OceanBase的实战方案。mysqldump 简单直接,适合中小数据量快速验证;DataX 功能强大,适合生产环境的大数据量迁移。迁移并没有想象中那么可怕,OceanBase的MySQL兼容性让这个过程变得非常平滑。

💡 课后思考

迁移完成后,业务SQL真的可以"零修改"直接运行吗?如果原来的MySQL里用了一些OceanBase不支持的语法(比如某些存储过程或触发器),我们该怎么排查和改造?欢迎在评论区分享你的迁移踩坑经历!