接到这个题目,我第一反应是“又来了”。这两年国产数据库的呼声一浪高过一浪,金融、电信、政务,都在推。但真正动手从MySQL迁过去的人,心里都清楚,这活儿看着像搬家,其实更像动手术。数据在那儿摆着,业务在跑着,一个不小心,半夜三点被叫起来回滚的滋味可不好受。我这几年帮人擦过不少这种“手术”的屁股,今天就把那些容易踩的坑,一个个给你摆出来。

先说最基础也最坑人的:你以为SQL是通用的,其实语法细节全是雷。MySQL里用得好好的,到了某些国产库直接报错,人家要求写。这还算好的,更隐蔽的是字符串拼接。MySQL的函数在遇到NULL值时直接返回NULL,但有些国产库会返回空字符串,业务逻辑没变,结果悄悄就错了。我见过最离谱的一个案例,是排序规则不一致。MySQL默认,不区分大小写,但某国产库默认,区分。结果用户注册时填的邮箱是,登录时输,在MySQL里能登进去,迁过去死活登不上,用户投诉炸了锅。所以迁移前,第一件事不是导数据,是把所有SQL语句跑一遍回归测试,尤其是那些带函数、带排序、带聚合的。
第二个坑,藏在索引里。MySQL的InnoDB引擎,二级索引会自动带上主键列,这是它优化回表查询的底层逻辑。但有些国产数据库的索引实现并不完全照搬,或者优化器没那么聪明。你原来在MySQL里为了覆盖索引建的一个联合索引,迁过去之后,优化器可能就傻乎乎地只用了,然后回表查和。数据量小没事,一旦上千万行,查询直接从毫秒级掉到秒级。更麻烦的是,很多国产库不支持这种新特性,你想临时禁用某个索引来测试,还得先DROP再CREATE,生产环境哪敢这么玩。所以迁移前,把每个核心查询的执行计划打出来,迁过去之后逐个对比,看看索引命中情况有没有变化,这一步省不得。
接着聊聊存储过程、函数和触发器。很多老业务系统,业务逻辑全写在数据库里,几百行的存储过程跟面条似的。MySQL的存储过程语法和Oracle系数据库差别巨大,但国产库为了兼容Oracle,往往做了很多妥协,结果就是两边都不靠。你MySQL里写了个,在存储过程中用得好好的,迁过去之后发现某国产库不支持这个语法,得改成。还有更坑的,MySQL的语句用于抛出异常,但国产库可能要求你用。这些差异,靠人工改代码能改到崩溃。我的建议是,迁移前先做个静态扫描,把所有存储过程、函数、触发器全部列出来,评估改造工作量。如果量太大,干脆趁这个机会把逻辑上移到应用层,数据库只做存储。虽然工程量大,但长远看反而是件好事。
关于自增主键,这里也有个隐蔽的坑。MySQL的在事务回滚时不会复用ID,但某些国产数据库为了性能优化,可能会复用。看起来是小事,但如果你的业务里ID被用作订单号、流水号,或者和其他系统有对账逻辑,ID跳跃或者复用都会引发灾难。我遇到过一个真实案例,迁移后第二天,财务对账发现有两笔订单ID相同,查了半天发现是自增ID复用导致的。这个问题排查起来极其痛苦,因为不是必现的,只有特定条件下才触发。所以迁移的时候,如果系统对ID的连续性有要求,务必在测试环境专门做回滚测试,看看ID到底怎么分配。
再来说说那个最容易被忽视的:字符集和排序规则。MySQL 8.0默认,支持四字节的emoji表情,但很多国产库默认还是,也就是原来的,存不了emoji。你的用户评论里如果有个笑脸表情,迁过去直接报错,或者变成问号。还有就是排序规则,中文排序在MySQL里用,但国产库可能用的是,排序结果完全不同。你原来列表页按名称排序,迁过去顺序乱了,用户看着别扭,但又不至于报错,这种“软坑”最要命。建议迁移前,把所有表的字符集、排序规则列个清单,逐表核对,别嫌麻烦。
高可用切换这块,也是个重灾区。MySQL主从复制用的是binlog,GTID模式已经非常成熟。但国产数据库的复制机制五花八门,有的用自研的协议,有的兼容MySQL的binlog但实现有差异。迁移的时候,如果只迁了主库,没迁从库,或者从库的复制方式没验证过,一旦主库宕机,手动切换从库后发现数据不一致,那叫天天不应。更麻烦的是,很多国产库的半同步复制是假的,或者需要额外配置才能开启强一致性。我的建议是,迁移前先在测试环境模拟主库宕机、网络分区等故障场景,看看从库到底能不能自动接管,数据延迟多少秒。别信厂商PPT,自己动手测,测完心里才有底。
分库分表方案,这个坑可能更大。很多业务用的是ShardingSphere或者MyCat做分库分表,但国产数据库很多原生就支持分布式,或者反过来,根本不支持你原来的分片键逻辑。比如你原来按用户ID取模分到4个库,迁到国产库之后,人家可能要求你用分布式的全局索引,或者分片策略完全不一样。这意味着你的数据路由逻辑要重写,而且查询语句里如果带了跨分片关联,性能会断崖式下跌。我见过一个项目,迁移后某个报表查询从3秒变成3分钟,发现是分布式事务协调器成了瓶颈。所以,如果你用了分库分表,迁移前必须重新设计分片策略,别指望直接搬过去就能用。
再说运维和监控工具。MySQL的生态太成熟了,Percona Toolkit、pt-query-digest、Prometheus + mysqld_exporter,监控告警、慢查询分析、备份恢复,一套组合拳打下来,DBA玩得飞起。但国产数据库的生态还在建设期,很多工具要么不支持,要么功能残缺。你原来一条命令能查慢查询,迁过去发现得翻日志文件;原来备份用加,迁过去发现人家的备份工具不支持在线备份,得停服。这些细节看起来不起眼,但真到出故障的时候,手里没趁手的家伙,那才叫绝望。所以迁移前,先把运维工具链准备好,没有现成的就自己写脚本,别等上线了再补课。
说这么多,不是劝你别迁,而是提醒你:迁移国产数据库,不是简单的数据搬移,而是一次系统性的重构。技术选型、代码改写、数据校验、故障演练、运维切换,每一步都藏着坑。但话说回来,这些坑也不是不能填。关键在心态:别把它当成一次“替换”,而是当成一次“升级”。把迁移当作梳理老代码、优化数据模型的机会,反而能收获意外之喜。国产库这两年进步确实快,很多场景下性能已经不输MySQL,但“能用”和“好用”之间,隔着的就是这些细节。动手之前,把本文提到的每个坑都过一遍,做个清单,逐项打勾,你的迁移之路会平坦很多。祝你好运,也祝你不用半夜起来回滚。


