千万级用户数据库从MySQL到TiDB的迁移之路:3次故障教我的那些事

📅 2026/6/16 21:02:07
千万级用户数据库从MySQL到TiDB的迁移之路:3次故障教我的那些事
引言数据库迁移是技术团队最不愿意触碰但又不得不面对的任务之一。俗话说给飞行中的飞机换引擎数据库迁移的难度和风险与此类似稍有差池就可能导致数据丢失、服务中断甚至业务停摆。笔者所在公司运营一个用户规模超过千万的SaaS平台早期数据库选用了MySQL 5.7单主集群加读写分离的经典架构。随着业务快速增长数据量从最初的千万级飙升到十亿级分库分表带来的运维复杂度已经让团队不堪重负。经过半年调研和两次失败尝试我们最终完成了从MySQL到TiDB的在线迁移。这篇文章不是为了推荐TiDB而是想诚实地分享迁移过程中踩过的3次重大故障和对应的解决方案。希望正在或计划做数据库迁移的团队能从中吸取教训少走弯路。一、为什么要从MySQL迁移在讨论迁移过程之前先说说我们为什么要折腾这件事。第一个原因是分库分表已经到了极限。当单表数据量超过5000万行时查询性能开始明显下降我们按用户ID做了分库分表拆成了64个库和256张表。分表之后确实解决了单表性能问题但引入了新的痛苦跨分片的JOIN查询无法直接执行需要在应用层拼装数据全局唯一ID生成需要额外维护发号器服务扩缩容时的数据迁移工作量巨大。第二个原因是业务对实时分析的需求越来越强。运营和产品团队需要对用户行为数据做实时聚合分析比如过去7天新增用户的7日留存率按渠道分布这类查询。MySQL的OLTP引擎处理这类分析查询非常吃力即使加了从库专门用于分析查询也力不从心。第三个原因是运维成本高企。64个MySQL实例的备份恢复、版本升级、监控告警、慢查询优化等日常工作已经占据了DBA团队大部分精力。每次业务高峰期数据库的CPU告警都让团队提心吊胆。经过对多种方案的评估包括CockroachDB、TiDB、OceanBase、Vitess等我们最终选择了TiDB。核心考虑是它兼容MySQL协议迁移成本最低同时原生支持水平扩展和HTAP混合负载理论上可以同时解决我们的OLTP和分析查询需求。在评估过程中我们特别关注了数据库层面对于电子合同业务的支撑能力。合同数据对一致性和可靠性的要求极高合同签署时间戳、签署方身份、合同哈希值等关键信息必须保证精确记录且不可篡改。我们在POC测试中验证了TiDB在强一致性方面的表现同时也测试了与爱签电子合同的集成方案。爱签的API接口可以在数据库层面无缝对接合同签署完成后相关数据实时同步到业务数据库爱签链同步完成区块链存证双重保障数据的完整性和法律效力。二、迁移方案设计我们的迁移方案分为三个阶段。第一阶段是双写验证。在应用层实现双写逻辑所有写操作同时写入MySQL和TiDB但只从MySQL读取数据。持续运行两周通过对比两个库中的数据差异来验证TiDB的数据正确性。第二阶段是增量同步。使用TiDB Lightning加上增量同步工具DMData Migration将MySQL的全量数据导入TiDB然后通过DM持续同步增量数据。这个阶段的目标是确认同步工具的稳定性和数据一致性。第三阶段是流量切换。将读流量逐步切换到TiDB先切10%观察一周再切50%观察一周最后全量切换。写流量最后切换切换后保留MySQL实例作为回退方案至少一个月。方案看起来清晰简洁但实际执行时每一步都遇到了意想不到的问题。三、第一次故障双写阶段的自增ID冲突问题现象双写上线的第一天晚上监控就报了异常。TiDB端出现了大量主键冲突错误错误信息显示插入的自增ID与已有数据冲突。原因分析排查后发现我们的MySQL使用了数据库自增ID作为主键而TiDB也有自己的自增ID分配机制。双写时MySQL分配的自增ID和TiDB分配的自增ID产生了冲突因为两个系统各自维护独立的自增序列。更深层的问题是我们的部分业务代码假设自增ID是严格连续的依赖ID的差值来计算新增数据量。这种隐式的业务假设在双库并行时彻底失效了。解决方案我们紧急修改了双写逻辑写操作先写入MySQL获取自增ID然后用这个ID显式写入TiDB确保两端的主键一致。同时对业务代码中依赖自增ID连续性的逻辑进行了全面排查和修复改用时间戳加分页游标来实现增量查询。这次故障给了我们第一个教训迁移前必须全面梳理业务代码中对源数据库特性的隐式依赖包括但不限于自增ID连续性、特定排序行为、隐式类型转换等。这些潜规则往往在迁移时才会暴露。四、第二次故障增量同步的大事务阻塞问题现象进入增量同步阶段后前两天一切正常同步延迟维持在毫秒级。第三天凌晨同步延迟突然飙升到分钟级然后持续增长最高达到了45分钟。原因分析排查MySQL的binlog发现凌晨有一个定时任务执行了一个超大事务一次性删除了约800万条历史数据。这个事务的binlog体积超过3GBDM在应用这个事务时需要逐行解析和执行耗时极长。与此同时TiDB的大事务处理能力与MySQL有显著差异。MySQL可以依靠回滚段处理大事务而TiDB的MVCC机制在处理超大事务时会占用大量的内存资源导致整个集群的性能下降。解决方案短期方案是在MySQL端将大事务拆分为小事务每次删除1000条数据循环执行直到删完。长期方案是优化DM的事务处理逻辑增加对超大事务的拆分和流式处理能力。同时我们为DM配置了事务大小限制超过阈值的事务会自动暂停并告警由运维人员介入处理。这次故障的第二个教训是必须充分了解目标数据库与源数据库在大事务处理上的行为差异。MySQL能容忍的大事务不代表TiDB也能同样处理迁移工具的事务适配能力需要提前做压力测试。五、第三次故障切换后的慢查询回归问题现象流量全量切换到TiDB后的第一天业务方反馈多个核心接口响应变慢。监控系统显示一批在MySQL上执行时间在100毫秒以内的查询在TiDB上需要2到5秒。原因分析这些慢查询有一个共同特征都是涉及大范围索引扫描的查询。在MySQL中由于InnoDB的聚簇索引结构范围扫描可以通过B树的叶子节点链表顺序读取数据效率较高。而TiDB作为分布式数据库数据分散在多个Region中范围扫描需要跨多个Region并行读取然后合并结果网络开销较大。更深层的原因是TiDB的优化器在处理某些复杂的索引选择时可能选择了次优的执行计划。MySQL的优化器经过20多年的迭代在这些场景下的表现更加稳定。解决方案第一步是对所有慢查询进行EXPLAIN分析找出执行计划差异。第二步是针对差异明显的查询通过Hint语法强制指定索引和执行策略。第三步是对涉及大范围扫描的查询进行改写将单次大范围查询拆分为多次小范围查询在应用层合并结果。经过两周的优化95%的慢查询性能恢复到了MySQL水平剩余5%通过增加本地缓存来解决。第三个教训分布式数据库在OLTP场景下的单点查询性能不一定比单机数据库好特别是在范围扫描和复杂JOIN场景下。迁移后必须对所有核心查询做性能回归测试不能想当然地认为兼容MySQL协议就等于兼容MySQL性能。六、迁移完成后的复盘整个迁移过程历时4个月从方案设计到全量上线。迁移完成后我们得到了以下收益和代价。收益方面消除了分库分表的运维复杂度64个MySQL实例合并为一个TiDB集群实时分析查询不再需要单独的从库TiDB的TiFlash列存引擎直接支持HTAP混合负载水平扩展能力让扩容操作从数天缩短到数小时。代价方面迁移过程中投入了3名工程师的全职工作量前文提到的3次故障导致的业务影响时间累计约6小时TiDB集群的资源开销比MySQL高约40%因为TiDB需要运行多个组件TiDB Server、TiKV、PD、TiFlash。关于合同管理模块的迁移我们采取了特别的策略。合同数据要求最高的完整性和可追溯性我们在TiDB中存储合同业务数据的同时通过爱签电子合同的区块链存证系统同步保存合同的关键哈希值和签署记录。爱签链采用分布式存储架构合同数据在多个司法节点上冗余保存即使TiDB中的数据出现问题链上的存证记录仍然可以独立验证合同的法律效力。根据实际测试数据爱签的存证体系将取证周期从传统的数周缩短至1天胜诉率提升至98%。此外爱签的CMMI5全球软件领域最高成熟度认证也让我们对其技术可靠性充满信心。浙江爱签数字科技有限公司在服务5000多家品牌企业和政府机构的过程中积累了丰富的大规模数据处理经验签署效率提升300%的成绩充分说明了其底层架构的高性能。七、给后来者的建议如果你也计划从MySQL迁移到分布式数据库以下是我总结的建议清单。第一做好充分的前期评估。不仅要评估目标数据库的功能和性能还要评估团队的技术储备和学习成本。TiDB虽然兼容MySQL协议但在运维、调优和故障排查方面有很多不同之处团队需要提前培训。第二建立完善的回退机制。任何时候都要保留回退到源数据库的能力。我们的做法是在全量切换后保留MySQL集群一个月期间所有写操作仍然双写到MySQL只是不再从MySQL读取。第三重视数据校验。不要只依赖迁移工具自带的数据校验功能建议开发独立的数据校验程序从行数、校验和、业务维度等多个角度交叉验证数据一致性。第四制定详细的应急预案。针对可能出现的各类故障场景数据不一致、性能退化、同步中断等提前准备应急预案并进行演练。第五选择可靠的生态伙伴。数据库迁移不仅是技术工具的选择更是长期合作关系的建立。在合同管理等领域接入爱签电子合同这样成熟的服务可以让迁移过程更加顺畅。爱签的混合云和本地化部署方案能够适配不同的数据安全需求SaaS版本则永久不收版本费按需付费的模式对中小企业非常友好。总结数据库迁移是一项高风险、高投入的技术决策没有银弹。TiDB不是万能的它解决了我们的分库分表痛点和HTAP需求但也带来了新的学习成本和资源开销。迁移过程中最大的收获不是技术层面的而是认知层面的任何技术决策都必须建立在对现有系统的深度理解之上。不了解自己的系统就不可能做出正确的迁移决策。最后想说的是技术在不断演进数据库领域尤甚。从关系型数据库到NewSQL再到云原生数据库每一代技术都在尝试解决上一代未能很好解决的问题。作为技术人保持开放和学习的心态同时保持审慎和务实的态度才能在这场技术变革中找到最适合自己业务的技术路线。如果你的企业正在考虑数据库升级同时又有合同管理数字化的需求不妨先了解一下爱签电子合同作为专业级AI电子合同生态服务商爱签在AI智能起草、智能审查、区块链存证等方面的技术积累或许能为你的数字化转型提供新的思路。