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

任务不是整库同步,源库发生Online DDL操作

  • 现象:某张临时表不存在或者已经存在报错。
  • 解法:
    • 从同步对象中去掉报错的源表,重启DTS任务。
    • 从目标库中删除报错的源表,等DTS任务没有延迟后,再在同步对象中加上报错的表即可。

源库数据中有AnalyticDB for MySQL不支持的非法值存在

  • 现象:报错类似Cannot parse "2013-05-00 00:00:00": Value 0 for dayOfMonth must be in the range [1,31]], 主要是时间、日期类型的字段报错。
  • 解法:因为AnalyticDB for MySQL不支持报错的非法值写入。
    • 如果任务处于全量初始化阶段,则将源表的值修改为合法值即可(例如将上面的报错值改为2013-05-01 00:00:00)。
    • 如果任务处于增量同步阶段,则需要把这张表从同步对象中去掉,修改源表值为合法值,把表添加到同步对象中,然后重启同步任务。
    • 如果是整库同步的增量同步阶段报错,请提交工单处理。

不支持同步过程中修改字段类型

现象:报错类似'id' is LONG type, Can't change column type to DECIMAL或者modify precision is not supported, col=id, type decimal, old=11, new=21,主要为修改字段类型的报错提示。

解法:数据同步过程中,可以修改源表中的字段类型,目前仅支持将Tinyint > Smallint > Int > Bigint、Float > Double。
说明 可以将Tinyint更改为Int,即只能将存储字节数小的数据类型更改为存储字节数大的数据类型,或者将小精度数据类型更改为大精度数据类型。
对于不支持修改的字段类型,如果直接修改字段类型将报错,可通过以下两种方式解决。
  • 如果同步任务是整库同步,可以在AnalyticDB for MySQL中新建一张表,表名不同于报错的表,表结构和源表的表结构一致,通过Insert Into Select将报错表中的数据写入新建表中,删除报错的表,然后通过Rename将新表更名为报错的表名,重启DTS任务即可。
  • 如果同步任务不是整库同步,则需要把这张表从同步对象中删除,然后重启DTS任务,等任务延迟追上后,再把表加入同步对象中重新同步即可。

磁盘满报错

现象:报错信息是disk is over flow

解法:报错表示AnalyticDB for MySQL集群磁盘已满,需要扩容或者删除部分数据以释放磁盘空间,保证磁盘空间足够后重启DTS任务即可。

不支持主键为Null

现象:报错信息类似syntax error :column 'TABLE.COL' is primary key, can not set null即字段不能写入Null值。

解法:目前AnalyticDB for MySQL不支持主键字段写入Null值,如果可以修改源表主键为Null的值,则修改源表值,如果不能修改则无法对此表进行同步。

不支持同步无主键的表

现象:DTS同步任务是整库同步,在源库创建的无主键表没有同步到目标库中时,报错信息一般是表不存在。

解法:由于DTS不支持无主键表同步到AnalyticDB for MySQL中,如果遇到此情况,需要手动在目标库创建表并且保证新建的表有主键,建表后重启DTS任务即可。

网络连接不稳定

现象:任务报错信息是Get inc_checkpoint config from Meta failed或者Read timed out

解法:DTS任务连接源数据库超时报错,可以尝试重启DTS任务。