本文列出了通过DTS同步数据到AnalyticDB for MySQL中可能遇到的问题。

数据类型修改错误

报错示例
‘id' is LONG type, Can't change column type to DECIMAL
modify precision is not supported, col=id, type decimal, old=11, new=21
可能原因
  • 目前不支持跨大字段类型修改, 比如int->varchar。
  • 目前不支持decimal精度修改,比如decimal(4,2)->decimal(6,2)等。
解决方案
  • 非整库同步:

    建议重新同步这张表(即先从同步对象中去掉,然后删除目标库的表,再把这张表加入到同步对象中),DTS会重新进行包括schema拉取的全量同步,这样会跳过此类型的DDL。

  • 整库同步:

    在AnalyticDB for MySQL中新建一张表,表名要不同于报错的表,表结构需要和源表的表结构一致,通过Insert Into Select将源表中的数据写入新建表中,删除报错的表,然后通过Rename将新表更名为报错的表名,重启DTS任务即可。

非法日期值写入

报错示例
Cannot parse "2013-05-00 00:00:00": Value 0 for dayOfMonth must be in the range [1,31]]
主要是时间、日期类型的字段报错。
可能原因
与MySQL不同,ADB不支持非法日期值的写入。
解决方案
  • 任务处于全量初始化阶段:

    将源表的值修改为合法值即可(例如将上面的报错值改为2013-05-01 00:00:00)。

  • 任务处于增量同步阶段:

    把这张表从同步对象中去掉,修改源表值为合法值,把表添加到同步对象中,然后重启同步任务。

  • 整库同步的增量同步阶段:

    请提交工单,ADB的值班人员会打开非法值写入开关,开关打开后,所有非法值的写入会被转为null。

不支持无主键表同步

报错示例
表不存在,如
DTS-077004: Record Replicator error. cause by [[17003,2020051513063717201600100703453067067] table not exist => xxx_table] 
可能原因
目前AnalyticDB for MySQL不支持无主键表的同步。
解决方案
只会在整库同步时才会发生,需要先判断源库是否为无主键表,如果是,由于DTS不支持无主键表同步到AnalyticDB for MySQL中,遇到此情况,请手动在目标库创建表并且保证新建的表有主键,建表后重启DTS任务即可。

建表时字段默认值过长报错

报错示例
default value is too long
解决方案
提交工单,要求AnalyticDB for MySQL实例升级到最新版本。

写入单条记录超过16M

报错示例
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (120468711 > 33554432). You can change this value on the server by setting the max_allowed_packet' variable.
解决方案
提交工单,要求AnalyticDB for MySQL实例升级到最新版本。

磁盘空间满

报错示例
disk is over flow
解决方案
删除部分数据以释放足够的磁盘空间,或者提交工单要求扩容,保证磁盘空间足够后重启DTS任务即可。

缺少表或者缺少字段

报错示例
table not exist => t1
解决方案
先确认在DTS配置的时候是否选择了所有DDL同步(比如建表语句、其他DDL语句等),如果没有的话选中即可。