兼容性意味着什么
迁移成本的高低,主要取决于应用是否需要改代码。分布式数据库通常选择在协议层面对齐 MySQL,这样既有的驱动、ORM 框架和连接池可以继续使用,改造成本大幅下降。常见做法是兼容 MySQL 8.0 的协议与大部分语法,同时提供配套的数据迁移工具链。
但兼容不等于完全等价,迁移前必须逐项确认边界,避免上线后才发现行为差异。
语法与语义上的差异点
以 TiDB 为例,其兼容性文档与源码分析中值得注意的点包括:
- 语句支持范围:部分语句并未完整支持,例如
REPLACE在早期版本中就不在支持范围内,需要改成等价的INSERT ... ON DUPLICATE KEY UPDATE或先删后插; - 索引语义:分布式数据库对值的获取都以 KV 操作为基础,索引更多是为了保证唯一性等约束与 MySQL 表现一致,而不是承担查询加速的全部职责;
- 事务隔离:默认隔离级别与 MySQL 不同,长事务和大事务的代价更高,需要重新审视事务边界;
- 自增与字符集:自增列在分布式环境下不保证连续,排序与字符集排序规则也需要实测验证。
经验做法:把生产库的慢查询日志和全量 SQL 采集出来,逐条在目标库上做兼容性回归,比只靠文档核对可靠得多。
三阶段迁移路径
第一阶段:结构迁移
导出 DDL 并在目标库重建。这个阶段要处理的是约束差异、索引策略和分片键选择。主键设计在这一步就要定好,因为它直接决定后续数据分布是否均匀。
第二阶段:全量数据迁移
把存量数据导出后并行导入目标库。此阶段的核心指标是吞吐与一致性,通常采用逻辑导出加并行导入的组合,并在导入完成后校验行数与关键字段的校验和。
第三阶段:增量同步与切换
在全量迁移期间,源库仍在写入,因此需要增量同步组件持续捕获变更并应用到目标库,使两边数据趋近一致。切换时通常按以下顺序执行:
- 停止写入或加只读锁,记录位点;
- 等待增量同步追平,确认延迟归零;
- 做最终一致性校验;
- 把应用连接切换到新集群,观察一段时间后再回滚下线旧库。
切换阶段的风险控制
- 可回滚性:切换前保留旧库并确保增量链路可反向,出问题能快速回退;
- 校验先行:不要跳过数据校验,行数一致不代表内容一致;
- 灰度放量:先切只读业务或非核心链路,再逐步切核心写链路;
- 性能基线:切换前用真实流量模型压测,确认新集群在峰值下的表现。
迁移从来不是一次性的技术动作,而是一个需要反复验证的工程过程。把兼容性边界摸清、把回滚路径留好,切换才能真正做到低风险。
| 结构迁移 | 重建 DDL、确认约束与索引差异、确定分片键与主键策略 |
|---|---|
| 全量迁移 | 逻辑导出 + 并行导入存量数据,完成后做行数与校验和比对 |
| 增量同步 | 捕获源库变更并持续应用,保持两边数据趋近一致 |
| 切换窗口 | 停写记录位点、等待追平、最终校验、切换连接、保留回滚路径 |
| 主要风险 | 语句支持差异、事务语义差异、自增不连续、校验遗漏 |