為什麼我的 AWS DMS 任務沒有重試?

上次更新日期:2022 年 8 月 18 日

我有一個已停止且未重試的 AWS Database Migration Service (AWS DMS) 任務。如何恢復 AWS DMS 任務的操作?

解決方案

AWS DMS 是專為具有自我修復行為而設計的受管服務。這表示當問題發生時,AWS DMS 會嘗試修正問題,接著繼續操作,而您不需要採取任何動作。不過,在某些情況下,會停止遷移並且不會重試。

首先,了解使用 AWS DMS 時可能遇到的兩種錯誤類型,是相當重要的事:

  • 嚴重錯誤
  • 可加以復原的錯誤

嚴重錯誤

如果 AWS DMS 遇到阻止其繼續進行遷移的錯誤,則任務會停止並進入 FAILED 狀態。這稱為嚴重錯誤。部分範例包括:

  • 未設定來源端點,其為遷移的先決條件。
  • AWS DMS 複寫執行個體不會從來源資料庫擷取來源物件。

在工作日誌中,您會看到類似下列的訊息:

2022-05-28T16:07:35 [TASK_MANAGER    ]E:任務 'K7YJOFK7GYXIK44C2KLGFNG7ZONLZGPWPD5RWHA' 遇到了一個嚴重錯誤」

當 AWS DMS 遇到嚴重錯誤時,會嘗試重新啟動六次。如果您的任務不再重試,則其可能已經完成了這些嘗試。

可加以復原的錯誤

AWS DMS 會將所有環境錯誤視為可加以復原的錯誤。因此,如果任務或複寫執行個體遇到環境錯誤,則任務會中斷但會自行復原,接著則會重試。

可加以復原的錯誤的範例包括:

  • AWS DMS 複寫執行個體與來源/目標資料庫的連線中斷。
  • 由於維護的緣故,複寫執行個體已重新啟動。

在工作日誌中,您會看到類似下列的訊息:

「從子任務 0 收到的上一個錯誤任務錯誤通知,執行緒 0 [reptask/replicationtask.c:2673] [1022502] 停止原因 RECOVERABLE_ERROR 錯誤等級 RECOVERABLE」

根據預設,具有可加以復原錯誤的任務會無限期地嘗試重試。RecoverableErrorCount 設定會控制此行為。其遇到環境錯誤時,此參數會設定 AWS DMS 為了重新啟動任務所進行的嘗試次數上限。系統嘗試重新啟動任務的次數到達指定次數之後,任務就會停止,並且需要手動介入。預設值為 -1,其告知 AWS DMS 要無限期地重新啟動任務。

如果可加以復原的錯誤導致任務停止且不再重試,請檢查是否:

  • RecoverableErrorCount 參數設定為自訂值。
  • 複寫執行個體本身已關閉。

檢查其他非預設值設定是否正在阻止重試

如果這些設定設為非預設值,則可能會阻止 AWS DMS 任務進行重試:

"ErrorBehavior": {
        "FailOnNoTablesCaptured": false,
        "ApplyErrorUpdatePolicy": "LOG_ERROR",  --- can be set to STOP_TASK
        "FailOnTransactionConsistencyBreached": false,
        "RecoverableErrorThrottlingMax": 1800,
        "DataErrorEscalationPolicy": "SUSPEND_TABLE",  --- can be set to STOP_TASK
        "ApplyErrorEscalationCount": 0,
        "RecoverableErrorStopRetryAfterThrottlingMax": false,
        "RecoverableErrorThrottling": true,
        "ApplyErrorFailOnTruncationDdl": false,
        "DataTruncationErrorPolicy": "LOG_ERROR",  --- can be set to STOP_TASK
        "ApplyErrorInsertPolicy": "LOG_ERROR",  --- can be set to STOP_TASK
        "EventErrorPolicy": "IGNORE",
        "ApplyErrorEscalationPolicy": "LOG_ERROR",  --- can be set to STOP_TASK
        "RecoverableErrorCount": -1,
        "DataErrorEscalationCount": 0,
        "TableErrorEscalationPolicy": "STOP_TASK",
        "RecoverableErrorInterval": 5,
        "ApplyErrorDeletePolicy": "IGNORE_RECORD",  --- can be set to STOP_TASK
        "TableErrorEscalationCount": 0,
        "FullLoadIgnoreConflicts": true,
        "DataErrorPolicy": "LOG_ERROR",
        "TableErrorPolicy": "SUSPEND_TABLE"
    },