全部產品
Search
文件中心

Data Transmission Service:常見錯誤碼及排查方法

更新時間:Jul 06, 2024

本文介紹DTS的常見錯誤碼、報錯原因及排查方法,協助您進行初步的報錯排查。文中提及的報錯樣本僅供參考,實際遇到的報錯可能不完全一樣。

錯誤碼

報錯說明

報錯樣本

可能的解決方案

DTS-51009

DTS寫入模組讀取DTS緩衝模組時,顯示連線逾時。

DTS-31009: In process of processing data (recordRange: 5799806987638145024) failed cause: CriticalAnyAllException: capture-dstore: DTS-51009: Failed to fetch records from dstore TimeoutException: Failed to get offsets by times in 120000 ms

  • 原因:網路抖動等原因導致當前資料寫入模組串連緩衝模組逾時。

  • 解決方案:您可以嘗試重啟任務,查看重啟後任務是否恢複正常。

DTS-50019

DTS寫入模組讀取不到DTS緩衝模組中指定時間點的資料。

DTS-31009: In process of processing data (recordRange: 9117052685537771520) failed cause: CriticalAnyAllException: capture-dstore: DTS-51009: Failed to fetch records from dstore CriticalAnyAllException: capture-dstore: DTS-50019: seek timestamp for topic [-0] with position [{"timestamp":1621516671, "offset":-1}] failed

  • 原因1:任務暫停過久,重啟後DTS緩衝模組中已沒有相應位點(2021-5-20 21:17:51)的資料。

    說明

    報錯提示顯示的時間格式為Unix時間戳記,您可用搜尋引擎擷取Unix時間戳記轉換工具,將Unix時間戳記轉換為UTC時間。

    解決方案1:請查看源庫中用於增量資料解析的日誌(如Binlog或Redolog等),其時間範圍是否包括該時間點,如包括,請聯絡阿里雲支援人員由後台嘗試重新讀取資料,若不包括,則需重新建立任務。

    解決方案2:需重新建立任務。後續執行任務時,請勿長時間暫停任務,暫停超過6個小時,任務將不能成功啟動。

  • 原因2:任務失敗過久,修複後DTS緩衝模組中已沒有相應位點的資料。

    解決方案:需重新建立任務。後續執行任務時,如遇任務報錯,請儘快修複問題並恢複任務,避免任務因失敗過久而無法恢複。

  • 原因3:全量遷移或全量同步期間,DTS本地會迴圈儲存源庫近24小時或者50 GB的資料日誌,用於增量資料解析。如果全量遷移或全量同步期間較長,DTS本地可能已經清除全量任務啟動後緩衝的資料日誌,導致用於增量解析的資料日誌不完整。

    解決方案:需重新建立任務。建立任務前,請評估遷移或同步資料量,如資料量較大,建議拆分成多個遷移或同步任務。

DTS-30018,DTS-30019,DTS-70019

列不存在。

DTS-30019: Can not find column [column_in_source<-->column_in_target] in target table db_name.table_name

DTS-70019: Can not find column[column_in_source<-->column_in_target]in target table db_name.table_name

  • 可能原因

    • 原因1:配置任務時未選擇結構遷移,從而導致源端和目標端的表結構不一致。

    • 原因2:任務配置後,在源端或目標端執行DDL修改了表結構,從而導致源端和目標端的表結構不一致。

  • 解決方案:調整源端和目標端的表結構,確保兩端表結構一致。

說明

如果您的實際不符合以上原因,請嘗試以下方法:

  • 嘗試重啟任務看能否恢複。

  • 嘗試將報錯的表從同步對象刪除並重新添加,看能否恢複任務。

DTS-10046,DTS-30020

SQL執行異常。

DTS-10046: execute sql: CREATE TABLE if not exists`dts`.`table_name` ( `id` int(11) NOTNULL,`column1` bigint(20) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULTCHARSET=utf8 failed. Create TransactionTable failed. cause:MySQLSyntaxErrorException: CREATE command denied to user 'username'@'ip_address' for table 'table_name'

一般情況下,伴隨此錯誤碼,系統會同時輸出資料庫層面的具體報錯資訊。請參考具體報錯內容,檢查錯誤訊息中的SQL語句並進行修複。

  • 可能原因:資料庫帳號缺失CREATE TABLE許可權。

  • 解決方案:檢查許可權並賦予相應許可權。

DTS-70004

SQL執行異常。

DTS-70004: execute statement failed: /*dts_id=dtsaaaaaaaaaa*/alter table`xxx`.`yyy` modify column `aaa` INT default 0 comment 'bbb' cause:SQLException: [15018, 2021030506452201000000420803151947572] modify column type is not supported, col=x, oldType=bigint, newType=int

一般情況下,目標庫為AnalyticDB MySQL時,會出現樣本報錯資訊。

  • 可能原因:鏈路不支援該類型的DDL操作,從而導致DDL執行失敗。

  • 解決方案

    • 非整庫同步:建議重新同步這張表(即先從同步對象中去掉,然後刪除目標庫的表,再把這張表加入到同步對象中)。DTS會重新進行包括Schema拉取的全量同步,這樣會跳過此類型的DDL操作。

    • 整庫同步:在AnalyticDB MySQL中建立一張表,表名要不同於報錯的表,表結構需要和源表的表結構一致。通過INSERT INTO SELECT將源表中的資料寫入建立表中,刪除報錯的表,然後通過RENAME將新表更名為報錯的表名,重啟DTS任務即可。

DTS-70004:execute statement failed: /*aaaaaaaaaaMysqlEngine(28)*/update `xxx`.`yyy` set... error detail message:Server shutdown in progress MySQLNonTransientConnectionException: Server shutdown in progress

  • 可能原因:目標庫執行了SHUTDOWN操作。

  • 解決方案:確認目標庫正常後,重啟鏈路。

DTS-70004:execute statement failed: /*aaaaaaaaaaMysqlEngine(27)*/update `xxx`.`yyy` set... cause: SQLException: null, message from server: "Host '192.10.XX.XX' isnot allowed to connect to this MySQL server"

說明

修複完成後,需要重啟任務。

DTS-70004: execute statement failed: /*bg6l15vf29l1b0vMysqlEngine(16)*/insertinto `xxx`.`yyy` ... error detail message:Table 'xxx.yyy' doesn't existMySQLSyntaxErrorException: Table 'xxx.yyy' doesn't exist

  • 可能原因:對應表不存在。

  • 解決方案

    • 檢查該表在目標庫是否已被刪除。

    • 檢查結構遷移中是否把該表已同步。

說明

修複完成後,需要重啟任務。

o3z5bntMysqlEngine(0)*/insert into`xxx`.`yyy` ...error detail message:Column 'aaa' cannot be nullMySQLIntegrityConstraintViolationException: Column 'aaa' cannot be null

  • 可能原因:不符合資料庫的完整性規範約束,例如,不允許為空白的列插入了NULL。

  • 解決方案:檢查表結構和DML語句涉及的記錄,確保源和目的表結構一致,或者訂正資料後重啟任務。

DTS-70004: execute statement failed:/*s2gb356ds228bt8MysqlEngine(0)*/insert into `xxx`.`yyy` (`...`)values(...)error detail message:INSERT command denied to user'user'@'100.104.175.31' for table 'yyy' MySQLSyntaxErrorException: INSERTcommand denied to user 'user'@'100.104.175.31' for table 'yyy'

  • 可能原因:目標庫帳號相關許可權不足。

  • 解決方案:檢查目的庫帳號是否具有報錯資訊中提示的許可權,如有缺失,補足許可權後重啟任務。

DTS-70002

無法串連資料庫,或對應的庫/表不存在。

DTS-70002: get table detail info failed after 151times (user: db_name, database:table_name) MySQLSyntaxErrorException: Table 'db_name.table_name'doesn't exist

  • 可能原因:結構遷移報錯,導致相應表沒有遷移到目標端,也未在目標端手動建立表結構。

  • 解決方案:根據報錯資訊中的內容檢查庫或表是否存在。若不存在:

    • 同步任務:將報錯的表從同步對象中移除並重新添加,看能否恢複任務。

    • 遷移任務:重建鏈路。

DTS-60001

無法串連到源端資料庫。

DTS-60001: Create connection failed (url:ip_address:port, user: username) cause: SQLException: Access denied for user'username'@'ip_address' (using password: YES)

  • 可能原因:使用者名稱或密碼不正確。

  • 解決方案:輸入正確的使用者名稱和密碼,並重啟任務。

說明

若您的實際不符合上述原因,請嘗試以下方法:

DTS-61015

無法串連到源端資料庫。

DTS-61015: Create connection failed(url:ip_address:port, user: username) cause:MySQLNonTransientConnectionException: Data source rejected establishment ofconnection, message from server: "Too many connections"

  • 可能原因:源端資料庫連接數過多。

  • 解決方案:調整源端資料庫的最大串連數,並重啟任務。

說明

若您的實際不符合上述原因,請嘗試以下方法:

DTS-71016

無法串連到目標端資料庫。

  • 【樣本1】DTS-71016: connect target failed (url: jdbc:mysql://ip_address:port?parameters)cause: MySQLNonTransientConnectionException: Data source rejected establishmentof connection, message from server: "Too many connections"

  • 【樣本2】DTS-71016: connect target failed (url: jdbc:mysql://ip_address:port?parameters)cause: SQLException: null, message from server: "Host 'ip_address' isblocked because of many connection errors; unblock with 'mysqladminflush-hosts'"

  • 可能原因

    • 原因【樣本1】:目標端資料庫連接數過多。

    • 原因【樣本2】:同一個IP地址在短時間內產生太多失敗的資料庫連接,從而導致串連被阻塞。

  • 解決方案

    • 解法【樣本1】:調整目標端資料庫的最大串連數,並重啟任務。

    • 解法【樣本2】:在目標端資料庫側修複問題(比如提高MAX_CONNECTION_ERRORS的值)後,重啟任務。

DTS-10015

無法串連到Redis。

DTS-10015: unreachable redis network.JedisConnectionException: Could not get a resource from the poolJedisConnectionException: Failed connecting to ip_address:portConnectException: Connection timed out (Connection timed out)

  • 可能原因:Redis伺服器異常,導致無法串連。

  • 解決方案:請檢查Redis服務端狀態,是否能正常串連,並修複Redis問題。

DTS-30005

內部處理中儲存中繼資料資訊失敗

DTS-30005: save changed job progress info failed cause: SQLException:result content unexpected. expect 3 time 1, actually [2, 1, 1]

  • 可能原因:源庫存在表名相同,但是大小寫不同的表(如,TABLE和table),DTS當前不支援這種形式。

  • 解決方案:檢查源庫並核實商務邏輯,修改源庫中其中1個表名,並重建任務。

DTS-30011

寫資料異常

DTS-30011:put 2048 records error, currentRunningSQL:insert ignore into `xxx`.`yyy`(...), currentRunningRecordRange:{id:5362875948821643265,xxx.yyy,field:DefaultRecordField:{fieldName=aaa, dataType={typeName:BIGINT, typeId:-5, isLobType:false,encoding:null}, sourceDataType=null, aliases=[], defaultValue=null,nullable=false, unique=true, primary=true,generated=false},leftValue:1293615822270500864,rightValue:1311217506282770432,partition:null}cause: BatchUpdateException: The table 'yyy' is full SQLException: The table'yyy' is full

  • 可能原因

    • 原因1:磁碟空間滿。

    • 原因2:表的大小已達上限。

  • 解決方案

    • 解法1:擴容磁碟後重啟任務。

    • 解法2:在資料庫層面解決表的上限值問題。解決後重啟任務。

      說明

      針對MySQL資料庫,表的上限值設定,可參考B.3.2.10 The table is full

DTS-30011: put 2048 records error, currentRunningSQL:insert ignore into`xxx`.`yyy`(...:{id:4958981218625388545,schema:xxx.yyy,field:DefaultRecordField:{fieldName=aaa, dataType={typeName:INTEGER, typeId:4, isLobType:false,encoding:null}, sourceDataType=null, aliases=[], defaultValue=null,nullable=false, unique=true, primary=true,generated=false},leftValue:512021,rightValue:1024022,partition:null} cause:BatchUpdateException: Lock wait timeout exceeded; try restarting transactionMySQLTransactionRollbackException: Lock wait timeout exceeded; try restartingtransaction

  • 可能原因:目標庫存在鎖等待逾時。

  • 解決方案:目標庫為MySQL時,可通過以下命令檢查目標庫鎖的狀況。

    SHOW FULL PROCESSLIST;
    SELECT
    * FROM innodb_trx;
    說明

    修複完成後,需要重啟任務。

DTS-30011: put 2048 records error, currentRunningSQL:insert ignore into`xxx`.`yyy`(`...,currentRunningRecordRange:{id:4050997257913237860,schema:xxx.yyy,field:DefaultRecordField:{fieldName=id, dataType={typeName:BIGINT, typeId:-5, isLobType:false, encoding:null},sourceDataType=null, aliases=[], defaultValue=null, nullable=false,unique=true, primary=true,generated=false},leftValue:5424204045,rightValue:5424982251,partition:null}cause: SQLException: The MySQL server is running with the --read-only option soit cannot execute this statement

  • 可能原因:目標庫的狀態為Read-Only。

  • 解決方案

    • 通過SELECT @@read_only;語句檢查目標庫的狀態是否為唯讀狀態。

    • 通過SET GLOBAL read_only=0;語句關閉唯讀狀態。

    說明

    關閉唯讀狀態後,需要重啟任務。

DTS-1051009

DTS解析MySQL資料庫Binlog日誌異常。

java.IOEException: java.lang.IllegalArgumentException: Valid type fail, Column:column_name,Type:type_number

  • 可能原因:Binlog中的表結構與DTS本地的表結構不一致,導致Binlog解析失敗。出現這種表結構不一致主要的原因是:該表結構變更DDL語句未記錄到Binlog中,導致DTS解析不到DDL,未更新本機存放區的表結構。例如:執行SET SESSION sql_log_bin=0語句修改某個表的欄位類型,比如INT(11)修改為BIGINT(20)。

  • 解決方案:請聯絡阿里雲支援人員重新載入DTS本機存放區的表結構。