如何疑難排解因外部索引鍵條件約束違規錯誤而失敗的 AWS DMS 任務?

1 分的閱讀內容
0

我有一個 AWS Database Migration Service (AWS DMS) 任務因外部索引鍵條件約束違規而失敗了。

簡短說明

根據預設,AWS DMS 任務在完整載入階段會一次載入八個資料表。這些資料表依預設會按字母順序載入,除非您設定任務的載入順序。如需詳細資訊,請參閱 AWS Database Migration Service 新增對平行完整載入和全新 LOB 移轉機制的支援,有助於提升移轉速度完整載入期間的資料表載入順序

如果您沒有將載入順序設定為優先載入父資料表,則子資料表可能會在父資料表之前載入。這會導致任務失敗,並出現外部索引鍵條件約束違規錯誤。在此情況下,您會看到類似下列範例的日誌項目:

[TARGET_LOAD ]E: RetCode: SQL_ERROR SqlState: 0A000 NativeError: 1 Message: ERROR: cannot truncate a table referenced in a foreign key constraint; Error while executing the query [1022502] (ar_odbc_stmt.c:4622)

[TARGET_LOAD ]E: RetCode: SQL_ERROR SqlState: HY000 NativeError: 1217 Message: [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.23-log]Cannot delete or update a parent row: a foreign key constraint fails [1022502] (ar_odbc_stmt.c:4615)

執行中的複寫會使用交易式套用模式,使用與來源相同的認可順序套用交易。當任務處於執行中的複寫階段時,您可以在目標上啟動外部索引鍵條件約束。如果您為執行中的複寫使用批次套用模式,則您必須停用外部索引鍵,即使是在異動資料擷取 (CDC) 階段。

解決方法

若要解決此錯誤,請完成下列其中一個步驟:

  • 停用外部索引鍵條件約束
  • 使用捨棄目標資料表模式

停用外部索引鍵條件約束

如果目標是與 MySQL 相容的資料庫,那麼您可以使用額外的連接屬性來停用外部索引鍵條件約束:

initstmt=SET FOREIGN_KEY_CHECKS=0

如果目標是與 PostgreSQL 相容的資料庫,則您會在 CDC 階段看到外部索引鍵違規錯誤。若要解決此錯誤,請將 session_replication_role 參數設定為 replica。若要執行此操作,請為端點加上額外的連接屬性 afterConnectScript=SET session_replication_role='replica'。或者,使用 AWS Command Line Interface 將端點設定新增至目標端點。

對於其他資料庫引擎,請手動停用或捨棄外部索引鍵條件約束。

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI

使用「捨棄目標資料表」模式

使用捨棄目標資料表模式時,AWS DMS 只會建立所需的物件以供完整載入在目標上成功執行。AWS DMS 也稱之為 DROP_AND_CREATE 任務設定。不過,如果您使用捨棄目標資料表模式,則必須在 AWS DMS 之外手動建立其他物件。這包括次要索引、資料預設值和觸發程序等物件。

相關資訊

使用任務日誌疑難排解移轉問題

AWS 官方
AWS 官方已更新 10 個月前