兼容性意味着什么

迁移成本的高低,主要取决于应用是否需要改代码。分布式数据库通常选择在协议层面对齐 MySQL,这样既有的驱动、ORM 框架和连接池可以继续使用,改造成本大幅下降。常见做法是兼容 MySQL 8.0 的协议与大部分语法,同时提供配套的数据迁移工具链。

兼容不等于完全等价,迁移前必须逐项确认边界,避免上线后才发现行为差异。

语法与语义上的差异点

以 TiDB 为例,其兼容性文档与源码分析中值得注意的点包括:

  • 语句支持范围:部分语句并未完整支持,例如 REPLACE 在早期版本中就不在支持范围内,需要改成等价的 INSERT ... ON DUPLICATE KEY UPDATE 或先删后插;
  • 索引语义:分布式数据库对值的获取都以 KV 操作为基础,索引更多是为了保证唯一性等约束与 MySQL 表现一致,而不是承担查询加速的全部职责;
  • 事务隔离:默认隔离级别与 MySQL 不同,长事务和大事务的代价更高,需要重新审视事务边界;
  • 自增与字符集:自增列在分布式环境下不保证连续,排序与字符集排序规则也需要实测验证。
经验做法:把生产库的慢查询日志和全量 SQL 采集出来,逐条在目标库上做兼容性回归,比只靠文档核对可靠得多。

三阶段迁移路径

第一阶段:结构迁移

导出 DDL 并在目标库重建。这个阶段要处理的是约束差异、索引策略和分片键选择。主键设计在这一步就要定好,因为它直接决定后续数据分布是否均匀。

第二阶段:全量数据迁移

把存量数据导出后并行导入目标库。此阶段的核心指标是吞吐与一致性,通常采用逻辑导出加并行导入的组合,并在导入完成后校验行数与关键字段的校验和。

第三阶段:增量同步与切换

在全量迁移期间,源库仍在写入,因此需要增量同步组件持续捕获变更并应用到目标库,使两边数据趋近一致。切换时通常按以下顺序执行:

  1. 停止写入或加只读锁,记录位点;
  2. 等待增量同步追平,确认延迟归零;
  3. 做最终一致性校验;
  4. 把应用连接切换到新集群,观察一段时间后再回滚下线旧库。

切换阶段的风险控制

  • 可回滚性:切换前保留旧库并确保增量链路可反向,出问题能快速回退;
  • 校验先行:不要跳过数据校验,行数一致不代表内容一致;
  • 灰度放量:先切只读业务或非核心链路,再逐步切核心写链路;
  • 性能基线:切换前用真实流量模型压测,确认新集群在峰值下的表现。

迁移从来不是一次性的技术动作,而是一个需要反复验证的工程过程。把兼容性边界摸清、把回滚路径留好,切换才能真正做到低风险。

迁移三阶段与关键动作
结构迁移重建 DDL、确认约束与索引差异、确定分片键与主键策略
全量迁移逻辑导出 + 并行导入存量数据,完成后做行数与校验和比对
增量同步捕获源库变更并持续应用,保持两边数据趋近一致
切换窗口停写记录位点、等待追平、最终校验、切换连接、保留回滚路径
主要风险语句支持差异、事务语义差异、自增不连续、校验遗漏