本文介绍如何解决DTS实例运行过程中,关于表结构报错的问题。
目标库为MySQL
报错:Specified key was too long; max key length is 767 bytes
可能原因:MySQL的InnoDB引擎支持的表索引字段最大长度为767字节。
解决方法:对于5.6和5.7版本的RDS MySQL,您可以将目标实例innodb_large_prefix参数的值修改为ON,然后重新启动任务。修改参数的方法,请参见修改实例参数。
报错:Unknown collation: 'XXX'
可能原因:当前MySQL版本数据库不支持的字符集排序。
解决方法:手动修改字符集排序订正DDL语句。
报错:Unknown database 'XXX'
可能原因1:DTS任务使用的数据库账号权限不足,无法在目标端创建该数据库。
解决方法1:手动在目标端创建报错信息中的数据库,然后重新启动任务。
可能原因2:同步或迁移对象中,有与报错数据库相关联的对象。
解决方法2:确认报错信息中的数据库是否需要同步或迁移。
需要:将报错信息中的数据库,添加为待同步或迁移对象。
不需要:忽略报错信息中的数据库。
报错:Access denied for user 'XXXX'@'%' to database 'XXXX'
可能原因:DTS任务使用的数据库账号,没有访问报错信息中的数据库的权限。
解决方法:
方法一:使用权限足够的数据库账号,创建DTS任务。
方法二:给报错信息中的账号,授予足够的权限。
报错:Table ' XXX' doesn't exist
可能原因:创建VIEW等对象时,依赖的对象不存在。
解决方法:确认源库中是否存在依赖的对象。
存在:将依赖的对象,添加为待同步或迁移对象。
不存在:可以选择忽略对象。
报错:Unknown column 'xx.xxx' in 'field list'
可能原因:查询的VIEW已经失效,字段已经不在所属表中。
解决方法:确认是否继续使用此对象。
是:可以选择忽略对象。
否:修改DDL订正表的结构,然后重新启动任务。
报错:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable).
可能原因:目标库开启了Binlog,对于开启Binlog的实例,创建的函数有条件限制。
解决方法:确认是否继续使用此对象。
是:手动执行
set log_bin_trust_function_creators = 1
后,再执行修改对象的DDL。否:可以选择忽略对象。
目标库为PostgreSQL
报错:relation "XXX" does not exist
可能原因:报错信息中的对象依赖的对象不存在。
解决方法:
方法一:重新配置任务,将依赖的对象加入待同步或迁移的对象中。
方法二:手动将依赖的对象迁移到目标库,再重新启动任务。
报错:type XXX does not exist
可能原因:待同步或迁移对象依赖的自定义类型不存在。
解决方法:
方法一:重新配置任务,将依赖的自定义类型加入待同步或迁移的对象中。
方法二:手动在目标库创建依赖的自定义类型或插件,然后重新启动任务。
报错:permission denied to create extension "XXXX" Hint: Must be superuser or user with all of rds_superuser to create this extension.
可能原因:DTS任务使用的数据库账号权限不足,无法执行报错信息中的插件。
解决方法:
方法一:使用权限足够的数据库账号,创建DTS任务。
方法二:手动在目标库创建报错信息中的插件,然后重新启动任务。
目标库为云原生数据仓库 AnalyticDB MySQL 版
报错:XXXX=> db not found. use `show databases` to see all dbs.
可能原因:目标库中不存在报错信息中的数据库。
解决方法:手动在目标库创建报错信息中的数据库,然后重新启动任务。
目标库为SQL Server
报错:列名 'XXX' 无效
可能原因:待同步或迁移的表结构发生变化,删除了部分列,导致VIEW、PROC或FUNC不可用。
解决方法:
方法一:可以选择忽略对象。
方法二:请根据报错信息修正DDL语句,然后重新启动任务。
报错:The server principal "XXX" is not able to access the database "XXX" under the current security context.
可能原因:DTS任务使用的数据库账号权限不足。
解决方法:
方法一:使用权限足够的数据库账号,创建DTS任务。
方法二:给报错信息中的账号,授予足够的权限。
报错:VIEW、PROC或FUNC中的DDL语句报错
可能原因:依赖的对象没有迁移或者已经不存在。
解决方法:
方法一:可以选择忽略对象。
方法二:请根据报错信息修正DDL语句,然后重新启动任务。