外部キー制約違反エラーで失敗した AWS DMS タスクのトラブルシューティング方法を教えてください。

最終更新日: 2019 年 10 月 2 日

外部キー制約違反で失敗している 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: 外部キーの制約で参照されているテーブルを切り捨てることができません。クエリ [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] 親行を削除または更新できません : 外部キーの制約に失敗しました [1022502](ar_odbc_stmt.c:4615)

進行中のレプリケーションでは、ソースと同じコミット順序でトランザクションを適用するトランザクション適用モードを使用します。タスクが進行中のレプリケーションフェーズにある場合、ターゲットで外部キーの制約を有効にできます。進行中のレプリケーションにバッチ適用モードを使用する場合は、変更データキャプチャ (CDC) フェーズ中でも外部キーを無効にする必要があります。

解決方法

このエラーを解決するには、次のいずれかを実行します。

  • 外部キーの制約を無効にする
  • ターゲットのテーブルを削除モードを使用する

外部キーの制約を無効にする

ターゲットが MySQL 互換のデータベースの場合、追加の接続属性を使用して、次のように外部キーの制約を無効にすることができます。

initstmt=SET FOREIGN_KEY_CHECKS=0

ターゲットが PostgreSQL 互換のデータベースの場合、CDC フェーズ中に外部キー違反エラーを確認できます。このエラーを解決するには、session_replication_role パラメータを replica に設定します。

他のデータベースエンジンの場合は、外部キーの制約を手動で無効にするか「削除」します。

ターゲットのテーブルを削除モードを使用する

ターゲットのテーブルを削除モード (DROP_AND_CREATE タスク設定) を使用する場合、AWS DMS はターゲットで全ロードが成功するために必要なオブジェクトのみを作成します。ただし、ターゲットのテーブルを削除モードを使用する場合、セカンダリインデックス、データデフォルト、トリガーなど、AWS DMS によって作成されていない他のオブジェクトを手動で作成する必要があります。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合