第 6 篇:从自建 MySQL 迁移到云数据库的实战路径

数据库迁移最容易犯的错,就是把它想成搬家。好像把数据导过去、把连接串改掉、挑个低峰期切一下,就完事了。真正做过的人都知道,最难的从来不是导数据,而是怎么在业务不停、风险可控、出了问题还能退回来的前提下完成切换。

如果你的目标是把自建 MySQL 迁到云数据库,一个更靠谱的思路不是“找个周末晚上狠狠干一把”,而是把迁移拆成一串可以验证、可以中止、可以回滚的阶段。

第一步:先做盘点,不要急着建新库

迁移前第一件事不是建目标库,而是盘点现状。至少要搞清楚这些信息:

  • 数据量有多大,增长速度如何
  • 是否存在大表、热点表、归档表
  • 哪些业务依赖强事务
  • 是否存在存储过程、触发器、事件调度器
  • 是否有跨库依赖、外部 ETL 或报表任务
  • 当前的备份、主从、监控和权限模型是什么

很多迁移失败,不是迁移工具不行,而是依赖关系没盘清楚。常见漏项包括:

  • 某个老报表任务直接连生产库跑
  • 某个运营脚本依赖特定账号权限
  • 某个服务偷偷用了本地时区或特定 SQL mode
  • 某些触发器和事件调度器没人知道还在跑

这些东西不在架构图上,但很可能在切换当天跳出来打你。

第二步:目标不是“兼容”,而是“可运行”

很多云数据库会写“兼容 MySQL”,这句话可以信,但不能全信。兼容通常意味着大部分常规场景可用,不意味着所有行为完全一致。

你至少要重点验证这些差异:

  • 核心 SQL 在目标环境的执行计划是否变化
  • 连接池和驱动版本是否兼容
  • 账号权限模型是否满足现有应用
  • 备份恢复、监控、告警是否能接上现有体系

再展开一点,实际还要看:

  • MySQL 版本差异会不会影响保留字、函数行为、字符集排序
  • 参数默认值有没有变化,比如事务隔离级别、sql_mode、大小写敏感规则
  • 只读节点的一致性语义是不是和原来预期一致
  • 主从延迟暴露方式有没有变化
  • 慢日志、审计日志、监控指标是不是还能接到原来的系统里

迁移前发现兼容性问题,代价通常是几天验证;上线后才发现,代价通常是事故。

第三步:建立双环境验证链路

一个成熟的迁移流程,重点不是把数据同步过去,而是让你在正式切换前,多次确认目标库是可信的。

比较实用的一套做法是:

  • 先做全量迁移,再持续增量同步
  • 对核心表做行数校验、校验和校验、抽样字段比对
  • 把只读流量或影子流量引到目标库验证查询行为
  • 对关键写入链路做灰度和回放验证

这里最重要的不是“同步任务状态显示成功”,而是“业务视角验证成功”。因为迁移工具只知道数据在不在,不知道业务语义是不是对的。

比如你可以做这些更靠谱的验证:

  • 核心表行数对齐
  • 金额、状态、时间字段做抽样比对
  • 关键查询在新旧库上的结果集做一致性比较
  • 同一批影子请求在新旧环境上的响应差异监控
  • 压测时观察主库、只读节点、连接池、复制延迟的表现

这一步做得越扎实,切换窗口就越不需要赌。

第四步:切换窗口只做一件事

切换窗口的原则非常简单:动作越少越好。

不要在切换当天同时做这些事:

  • 升级应用版本
  • 修改数据库参数
  • 改造 SQL
  • 新增缓存策略
  • 调整基础网络拓扑

切换当天最理想的状态就是只做一件事:把流量从旧库切到新库。其他动作都应该提前做完并验证过。这样一旦出问题,定位范围才足够小。

第五步:一定准备回滚

很多迁移方案会把切换步骤写得很细,但对回滚只写一句“如有异常立即回滚”。这等于没写。

没有明确回滚条件和回滚路径的切换,本质上不是工程方案,只是一次运气测试。

你至少要把这些事写清楚:

  • 什么现象出现时必须回滚
  • 回滚决策由谁拍板
  • 回滚后数据差异怎么处理
  • 回滚路径能否在限定时间内完成

如果业务无法承受双写复杂度,那至少要保证在回滚窗口里,源库依旧保持完整可用,且切换后的一段时间内有办法把新产生的数据安全带回去,或者有明确的差异补偿方案。

一个更现实的迁移节奏

对大多数中大型系统来说,更现实的迁移节奏通常是这样:

  1. 完成资产盘点和风险分级。
  2. 创建目标库并做参数、权限、监控初始化。
  3. 执行全量迁移和增量同步。
  4. 反复做数据校验和压测。
  5. 先切只读或低风险流量。
  6. 正式切主写流量。
  7. 观察稳定一段时间后,再下线源库。

这个过程看起来慢,但它的好处是把风险拆散了。数据库迁移最怕的不是慢,而是把所有未知风险压缩到一个晚上。

小结

迁移数据库不是搬文件,而是迁移一套一直在跑的系统。真正值得追求的目标不是最快切过去,而是:

  • 每一步都知道在验证什么
  • 出问题时知道先停哪
  • 必要时知道怎么退回去

很多看起来“很猛”的迁移方案,失败点都在于把切换当天当成决战日;而真正成熟的迁移,往往在切换前就已经把大部分风险消化掉了。

至此,这组云数据库系列文章完成了第一版。后续如果继续往下写,很适合再拆出几篇更实战的细分主题,比如“云上 MySQL 慢 SQL 排查套路”“数据库切换窗口 checklist”“数据库成本归因体系怎么建”“跨地域容灾演练应该怎么做”。