外部キー制約違反で失敗する AWS Database Migration Service (AWS DMS) タスクがあります。
簡単な説明
デフォルトでは、AWS DMS タスクはフルロードフェーズで一度に 8 つのテーブルをロードします。これらのテーブルは、タスクをロードする順序を設定しない限り、デフォルトでアルファベット順にロードされます。詳細については、「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 コマンドラインインターフェイスを使用して、ターゲットエンドポイントにエンドポイント設定を追加します。
他のデータベースエンジンの場合は、外部キー制約を手動で無効化または削除します。
注: AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
ターゲット上のテーブルを削除モードを使用する
ターゲット上のテーブルを削除モードを使用すると、AWS DMS ではターゲットでフルロードが成功するのに必要なオブジェクトのみが作成されます。AWS DMS では、これを DROP\ _AND\ _CREATE タスク設定とも呼びます。ただし、ターゲット上のテーブルを削除モードを使用する場合、AWS DMS 外部の他のオブジェクトは手動で作成する必要があります。これには、セカンダリインデックス、データデフォルト、トリガーなどのオブジェクトが含まれます。
関連情報
タスクログを使用して、移行の問題のトラブルシューティングをする