本文介紹如何解決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語句,然后重新啟動任務。