数据迁移过程中遇到的具体问题:
①提供给系统团队的表结构与生产不一致,导致脚本报错。因为历史遗留问题,存在部分直接在生产环境更改字段长度或添加索引的情况,导致测试环境和生产环境的表结构不同步。
今后所有生产的变动,一定要先在开发测试环境同步。对数据迁移,需要再三确认并同步生产、开发测试表结构。
②oracle表没有主键,按照对业务场景的理解新加tdsql表联合主键的时候出现了数据重复或主键空值的情况。
需要在演练环境中用生产数据排查,最好新加自增主键,或者对业务背景非常熟悉。
③对新加自增主键的表,代码里用的是insert into (select from)格式,没有指明插入的字段,导致sql报错字段不匹配。Column count doesn’t match value count.
需要对java代码中sql语法等进行书写规范,避免出现select、insert不指明字段的情况。对数据迁移,需要对更改了字段的表再三确认、排查相关代码里是否有问题。
④表编码是utf8mb4_general_ci,出现了没有区分大小写的情况,应该改成utf8mb4_bin。ci 是 case insensitive,不区分大小写,即大小写不敏感,a和A会在字符判断中会被当做一样的。bin 是二进制, a 和 A 会别区别对待(例如运行SELECT * FROM table WHERE txt = 'a', 那么在utf8mb4_bin中就找不到 txt = 'A' 的那一行, 而 utf8mb4_general_ci 则可以)
需要系统团队建库时统一处理。
⑤慢sql较多。除了tdsql库本身的性能问题,还出现了没有提前预知的问题。
主键是默认走索引的,abc3个字段组成了联合主键,如果要索引生效,就必须带上a字段,但是我们很多场景是用b或c字段联表查询,这样联合主键的索引就不会生效,所以需要单独加索引。
部分Where exists(select * from where 索引字段)索引字段未生效,需改成union all。