DTS-077100 向目標庫同步資料時出錯

weixin_33766168發表於2018-03-04
    DTS向目標庫表同步DML/DDL資料操作時出錯,一般是目標庫的某些原因導致的.
    首先,DTS不支援目標表上建有觸發器的場景,在該種情況下,任何錯誤都有可能發生(包括資料不一致等資料質量問題).

一.錯誤列表


com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '3205385' for key 'PRIMARY'.
    主鍵或唯一鍵衝突的錯誤.
    原因:該錯誤一般是由目標表'xxx'.'xxx'上的觸發器引起的(DTS的操作對'xxx'.'xxx'表不會引起主鍵或唯一鍵衝突,而是這張表上的觸發器內部sql引起的).參考DTS遷移觸發器的說明.
    解決方案: 刪除目標表'xxx'.'xxx'上的觸發器,點選重新啟動即可恢復.

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '***' in 'field list'.
    列不存在的錯誤.
    原因:該錯誤一般是由於使用者在目標表'xxx'.'xxx'上刪除了'***'列導致的(如果使用者真的不需要該列的話,可以在源表中刪除該列,DTS會自動同步該刪除列的DDL到目標表;如果使用者想在源表上保留該列的話,就應該在建立任務時選擇過濾該列).
    解決方案: 使用者手動在目標表'xxx'.'xxx'上建上該列'***',點選重新啟動即可恢復.

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'xxx.xxx' doesn't exist.
    表不存在的錯誤.
    原因:該錯誤一般是使用者在目標表'xxx'.'xxx'上刪除了該表導致的(如果使用者真的不需要該列的話,可以在源表中刪除該列,DTS會自動同步該刪除列的DDL到目標表;如果使用者想在源表上保留該列的話,就應該在建立任務時選擇過濾該列).
    解決方案: 使用者手動在目標庫上建上該不存在的表'xxx'.'xxx',點選重新啟動即可恢復.

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column '***' cannot be null.
    列不允許為null的錯誤.
    原因:該錯誤一般是由使用者在目標表'xxx'.'xxx'上修改該列不允許為null導致的.
    解決方案: 使用者手動在目標庫表上將該列修改為允許為null,點選重新啟動即可恢復.

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (...).
    違反外來鍵約束錯誤.
    原因:該錯誤一般是由使用者目標庫不支援session級別禁止外來鍵檢查導致的(使用者自研的MySQL分支版本).
    解決方案: 使用者手動在目標庫表上刪除響應的外來鍵約束,點選重新啟動即可恢復.

java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement.
    目標庫只允許讀操作了(--read-only).
    原因:目標庫被設定只讀了,可能是使用者操作或者是RDS例項過期(磁碟滿/內部主備切換)等原因.
    解決方案: 使用者可設定目標庫可寫或者續費RDS例項(升級RDS例項磁碟空間)之後,點選重新啟動即可恢復.

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction.
    在目標庫執行寫操作時獲取鎖超時(Lock wait timeout exceeded).
    原因:目標庫可能存在與該表相關的長查詢或者DDL.
    解決方案:等待目標庫的相關長查詢或者DDL執行完之後,點選重新啟動即可恢復.

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: INSERT(DELETE/UPDATE) command denied to user 'xxx'@'***' for table '*'.
    在目標庫執行寫操作時無許可權錯誤(INSERT(DELETE/UPDATE) command denied to user).
    原因:目標RDS磁碟滿或者過期鎖定.
    解決方案:升級RDS磁碟空間或者續費之後,點選重新啟動即可恢復.

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (12014078 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
    在目標庫執行寫操作的sql超過max_allowed_packet限制(Packet for query is too large...).
    原因:目標庫的max_allowed_packet設定太小.
    解決方案:在目標例項上用高許可權調整max_allowed_packet的大小(SET global max_allowed_packet=***),點選重新啟動即可恢復.

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool.
    在目標庫執行寫操作時獲取連線失敗.
    原因:無法連線目標Redis庫.
    解決方案:確認目標Redis庫可訪問之後,點選重新啟動即可恢復.



相關文章