giip
SES案件登録
Aurora MySQLDMSCDCレプリケーション障害対応

AWS DMSでError 1032が発生する原因と確認方法

公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13

結論

MySQLのError 1032は `ER_KEY_NOT_FOUND` で、DMSのCDCタスクでは「変更を適用しようとしたターゲット側の行が存在しない」ことを意味します。原因はほぼ、フルロードとCDCの境界での取りこぼし、ソースとターゲットの主キー不一致、ターゲット表に主キーが無い、フィルタや変換ルールによる行の除外、ターゲットへの他プロセスの書き込みのいずれかです。まずターゲットの `awsdms_apply_exceptions` を読み、失敗したステートメントと対象キーを特定してください。

この文書の適用条件

対象製品AWS DMS(ターゲット: Aurora MySQL / RDS for MySQL)
確認バージョンMySQL 5.7互換 / 8.0互換のターゲット。DMSのタスク設定名はレプリケーションインスタンスのエンジンバージョンにより差異があるため実タスクのJSONで確認
適用環境AWS(DMSレプリケーションインスタンス + Aurora MySQL ターゲット)
必要権限制御テーブルの参照はターゲットDBへの `SELECT`。タスク設定の変更はIAMの `dms:ModifyReplicationTask`
実行影響制御テーブルの参照は影響なし。タスク設定の変更はタスクの停止・再開を伴う
再起動DBの再起動は不要。タスク設定の変更にはDMSタスクの停止と再開が必要
最終検証日2026-08-13

そのまま実行できるコマンド

ターゲット上のDMS制御テーブルの配置を確認する参照のみ
対象
Aurora MySQL / RDS for MySQL(DMSターゲット)
権限
ターゲットDBへの接続権限
変更作業
なし(参照のみ)
Production実行
可能
-- 対象: Aurora MySQL / RDS for MySQL(DMSターゲット)
-- 権限: ターゲットDBへの接続権限
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_NAME IN (
    'awsdms_apply_exceptions',
    'awsdms_validation_failures_v1',
    'awsdms_status',
    'awsdms_suspended_tables',
    'awsdms_history'
)
ORDER BY TABLE_SCHEMA, TABLE_NAME;

制御テーブルが作られるスキーマはタスク設定の `ControlSchema` で決まります。既定値のままだとターゲット側のどのスキーマに置かれるかが環境によって変わるため、先にこのSQLで実際の配置を確認してから次のクエリのスキーマ名を置き換えてください。

適用エラーの明細を読む(awsdms_apply_exceptions)参照のみ
対象
DMSターゲット上の制御スキーマ
権限
制御スキーマへの `SELECT`
変更作業
なし(参照のみ)
Production実行
可能
-- 対象: DMSターゲット上の制御スキーマ(既定名は ControlSchema 設定に依存)
-- 権限: 制御スキーマへの SELECT
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
    TASK_NAME,
    TABLE_OWNER,
    TABLE_NAME,
    ERROR_TIME,
    LEFT(STATEMENT, 500) AS statement_head,
    LEFT(ERROR, 500)     AS error_head
FROM awsdms_control.awsdms_apply_exceptions
ORDER BY ERROR_TIME DESC
LIMIT 50;

`STATEMENT` に失敗したUPDATE/DELETE文が、`ERROR` にエンジンが返したエラー本文(1032 を含む)が入ります。`STATEMENT` のWHERE句に出ている値が、ターゲットに存在しなかったキーです。

検証(validation)で不一致になった行を読む参照のみ
対象
DMSターゲット上の制御スキーマ(`EnableValidation` が有効な場合のみ生成される)
権限
制御スキーマへの `SELECT`
変更作業
なし(参照のみ)
Production実行
可能
-- 対象: DMSターゲット上の制御スキーマ(EnableValidation 有効時のみ生成)
-- 権限: 制御スキーマへの SELECT
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
    TASK_NAME,
    TABLE_OWNER,
    TABLE_NAME,
    FAILURE_TIME,
    KEY_TYPE,
    `KEY`            AS row_key,
    FAILURE_TYPE,
    LEFT(DETAILS, 500) AS details_head
FROM awsdms_control.awsdms_validation_failures_v1
ORDER BY FAILURE_TIME DESC
LIMIT 50;

`KEY` はMySQLの予約語なのでバッククォートで囲んでいます。1032 が出ている表がここにも出ていれば、単発の適用失敗ではなくデータそのものが乖離しています。

ソースとターゲットの主キー定義を突き合わせる参照のみ
対象
ソース・ターゲット両方のMySQL互換DB
権限
対象スキーマのメタデータ参照権限
変更作業
なし(参照のみ)
Production実行
可能
-- 対象: ソース・ターゲット双方で同じSQLを実行して結果を比較する
-- 権限: 対象スキーマのメタデータ参照権限
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
    t.TABLE_SCHEMA,
    t.TABLE_NAME,
    (SELECT GROUP_CONCAT(k.COLUMN_NAME ORDER BY k.ORDINAL_POSITION)
       FROM information_schema.KEY_COLUMN_USAGE k
      WHERE k.TABLE_SCHEMA    = t.TABLE_SCHEMA
        AND k.TABLE_NAME      = t.TABLE_NAME
        AND k.CONSTRAINT_NAME = 'PRIMARY')            AS pk_columns,
    (SELECT COUNT(DISTINCT s.INDEX_NAME)
       FROM information_schema.STATISTICS s
      WHERE s.TABLE_SCHEMA = t.TABLE_SCHEMA
        AND s.TABLE_NAME   = t.TABLE_NAME
        AND s.NON_UNIQUE   = 0)                        AS unique_index_count
FROM information_schema.TABLES t
WHERE t.TABLE_SCHEMA = 'SampleDB'
  AND t.TABLE_TYPE   = 'BASE TABLE'
ORDER BY t.TABLE_NAME;

`pk_columns` が NULL の表は主キーがありません。主キーの無い表に対するCDCのUPDATE/DELETEは、DMSが全列一致で対象行を探すため、1032 が出やすくなります。ソースとターゲットで `pk_columns` が異なる場合も同様です。

1032 が出たキーの行がターゲットに存在するかを確認する参照のみ
対象
DMSターゲットのAurora MySQL
権限
対象テーブルへの `SELECT`
変更作業
なし(参照のみ)
Production実行
可能
-- 対象: DMSターゲットのAurora MySQL
-- 権限: 対象テーブルへの SELECT
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
-- awsdms_apply_exceptions の STATEMENT に出ていたキー値をそのまま当てる
SELECT COUNT(*) AS target_row_count
FROM SampleDB.sample_table
WHERE id = 1001;

-- 併せてソース側でも同じ条件で確認し、片方にしか無いのかを判定する
SELECT COUNT(*) AS source_row_count
FROM SampleDB.sample_table
WHERE id = 1001;

ソースにあってターゲットに無ければ、フルロードの取りこぼしかフィルタによる除外です。両方に無ければ、既に削除済みの行に対する遅れた変更が来ている(順序の問題)と判断できます。

DMSタスクの現在の設定を取得する参照のみ
対象
AWS DMS レプリケーションタスク
権限
IAM: `dms:DescribeReplicationTasks`
変更作業
なし(参照のみ)
Production実行
可能
# 対象: AWS DMS レプリケーションタスク
# 権限: IAM dms:DescribeReplicationTasks
# 変更作業: なし(参照のみ)
# Production 実行: 可能

# 1) タスク一覧と状態
aws dms describe-replication-tasks \
  --query 'ReplicationTasks[].{Id:ReplicationTaskIdentifier,Type:MigrationType,Status:Status}' \
  --output table

# 2) 対象タスクの設定JSONをそのまま取り出す(設定名の実体はここで確認する)
aws dms describe-replication-tasks \
  --filters Name=replication-task-id,Values=example-dms-task \
  --query 'ReplicationTasks[0].ReplicationTaskSettings' \
  --output text

DMSのタスク設定はバージョンによって使える項目が異なります。記事の設定名をそのまま信じず、このコマンドで実タスクのJSONを出力し、存在する項目だけを編集してください。タスクのログはCloudWatch Logsの `dms-tasks-<レプリケーションインスタンス名>` ロググループに出力されます。

適用エラー時の動作を変更する(タスク設定)
対象
AWS DMS レプリケーションタスク設定
権限
IAM: `dms:ModifyReplicationTask`(タスクの停止が必要)
変更作業
あり(エラー時の挙動が変わる。IGNORE_RECORD は変更を破棄する)
Production実行
影響を理解したうえでのみ。`IGNORE_RECORD` はデータ乖離を生む
// 対象: AWS DMS レプリケーションタスク設定(抜粋)
// 権限: IAM dms:ModifyReplicationTask(変更にはタスク停止が必要)
// 変更作業: あり(適用エラー時の挙動が変わる)
// Production 実行: 影響を理解したうえでのみ。IGNORE_RECORD は変更を黙って捨てる
{
  "TargetMetadata": {
    "TargetTablePrepMode": "DO_NOTHING"
  },
  "ErrorBehavior": {
    "ApplyErrorInsertPolicy": "LOG_ERROR",
    "ApplyErrorUpdatePolicy": "LOG_ERROR",
    "ApplyErrorDeletePolicy": "IGNORE_RECORD",
    "ApplyErrorEscalationPolicy": "LOG_ERROR",
    "ApplyErrorEscalationCount": 0,
    "TableErrorPolicy": "SUSPEND_TABLE"
  },
  "ValidationSettings": {
    "EnableValidation": true,
    "ValidationMode": "ROW_LEVEL",
    "ThreadCount": 5
  }
}

`ApplyErrorDeletePolicy` を `IGNORE_RECORD` にすると、削除できなかった変更を記録せずに捨てます。エラーは止まりますがソースとターゲットのデータは乖離します。切り分けが終わるまでは `LOG_ERROR` のままにし、`IGNORE_RECORD` にする場合は「どの表のどの期間の変更を捨てたか」を検証(validation)で追える状態にしてから行ってください。`TargetTablePrepMode` を `DROP_AND_CREATE` にするとフルロード時にターゲット表が作り直され、既存データは失われます。

結果の読み方

意味確認するポイント
TASK_NAMEエラーを記録したDMSタスク名複数タスクが同じターゲットを書いていないかを確認する
TABLE_OWNER対象表のスキーマ(オーナー)想定した移行対象スキーマかどうか
TABLE_NAME対象表名特定の表に偏っているなら、その表の主キー定義とフィルタを疑う
ERROR_TIMEエラー発生時刻フルロード完了時刻やタスク再開時刻の直後に集中していないか
statement_head失敗したステートメントの先頭UPDATEかDELETEか、WHERE句にどのキー値が使われているか
error_headエンジンが返したエラー本文1032 以外(1062 の重複キーなど)が混ざっていないか
row_key(validation側)不一致になった行のキー値ソース側で同じキーの行を照会して、実際にどちらに存在するかを確認する
FAILURE_TYPE(validation側)不一致の種類欠落なのか値の相違なのかで対処が変わる

こういう状況で使います

  • DMSタスクのログに `Error 1032` または `ER_KEY_NOT_FOUND` が繰り返し出力される
  • CDCフェーズに入った直後からエラーが増え、特定の表だけ止まっている
  • タスクの状態が `Running` のままなのに、ターゲットの行数がソースに追いつかない
  • DMSコンソールの表統計で特定表が `Table error` / 一時停止になっている
  • 検証を有効にしたら `awsdms_validation_failures_v1` に大量の行が入った

考えられる原因(可能性の高い順)

  1. 01

    フルロードとCDCの境界で対象行がターゲットに入っていない

    フルロード開始時点のスナップショット以降に挿入され、その後更新・削除された行は、CDCで先に更新が届いてもターゲットに存在しないことがあります。タスク開始位置とフルロード完了時刻の関係を確認してください。

  2. 02

    ソースとターゲットで主キー・一意キーが一致していない

    ターゲット側だけ主キー列が異なる、あるいは主キーを張り替えている場合、DMSが生成するWHERE句が対象行に当たりません。両側で `KEY_COLUMN_USAGE` を突き合わせてください。

  3. 03

    ターゲット表に主キーが無い

    主キーが無いとDMSは全列一致で対象行を探します。浮動小数点や文字コードの差、LOB列の扱いによって一致せず、1032 になります。CDC対象の表には主キーまたは一意キーを用意するのが前提です。

  4. 04

    選択ルール・変換ルールで行や列が除外されている

    テーブルマッピングのフィルタで一部の行だけを移行している場合、対象外の行に対する更新がCDCで届き、ターゲットに存在せずエラーになります。列のリネームや除外も同じ影響を与えます。

  5. 05

    ターゲット側を別のプロセスが更新している

    アプリケーションや別のDMSタスク、バッチがターゲットに書き込んでいると、DMSが前提とする行の状態が崩れます。移行中のターゲットは書き込みをDMSに限定するのが原則です。

  6. 06

    binlogが必要な期間より早く削除され、変更が欠落した

    ソース側のbinlog保持時間が短いとCDCが読み損ね、再開時に整合しない状態から適用が始まることがあります。保持時間の確認は関連文書を参照してください。

確認手順

  1. 1

    エラーの実体を制御テーブルで確認する

    参照のみ

    `awsdms_apply_exceptions` を時刻降順で読み、対象表・ステートメント・キー値を特定します。参照のみで安全です。

  2. 2

    CloudWatch Logsでタスクログを確認する

    参照のみ

    `dms-tasks-<レプリケーションインスタンス名>` ロググループで、エラーの前後に何が起きていたか(再開、テーブル一時停止、接続断)を確認します。

  3. 3

    ソースとターゲットの主キー定義を突き合わせる

    参照のみ

    上記のメタデータSQLを両側で実行し、`pk_columns` が一致しているか、NULL の表がないかを確認します。

  4. 4

    該当キーの行の存在をソース・ターゲット双方で確認する

    参照のみ

    どちらに存在するかで、取りこぼしなのか順序の問題なのかが決まります。

  5. 5

    タスクのテーブルマッピングと設定JSONを確認する

    参照のみ

    `describe-replication-tasks` で実際の設定を取り出し、フィルタ・変換ルール・`ErrorBehavior` の現在値を確認します。

  6. 6

    検証(validation)を有効にして乖離の範囲を測る

    `EnableValidation` を有効にすると比較負荷がソース・ターゲット双方にかかります。負荷を許容できる時間帯で実施してください。

対応方法

すぐに実施できる低リスクの対応

  • エラーの出ている表を特定して切り分ける

    参照のみ

    全体を止める前に、`awsdms_apply_exceptions` で表単位に絞ります。1表だけなら、その表の再ロードで済むことが多いです。

  • ターゲットへの他プロセスからの書き込みを止める

    DMS以外の書き込みがある場合、設定を変えても再発します。まず書き込み経路を1本にします。

事前検討が必要な変更

  • 該当表に主キーまたは一意キーを追加する

    CDC対象表に主キーが無いことが原因なら、ターゲット(必要ならソースも)にキーを定義します。スキーマ変更にあたるため、検証環境での確認と実行時間帯の調整が必要です。

  • 該当表だけを再ロードする

    DMSの「テーブルのリロード」で対象表のみフルロードをやり直します。対象表は一時的に不整合な状態を経由するため、参照側の影響を確認してから実施してください。

  • テーブルマッピングのフィルタを見直す

    行フィルタで一部だけを移行している場合、CDCで届く更新の範囲と一致させます。一致させられないなら、その表はフィルタなしで移行対象にします。

再起動・サービス影響を伴う変更

  • `ApplyErrorDeletePolicy` を `IGNORE_RECORD` にする

    エラーは止まりますが、適用できなかった削除を記録せずに捨てるためデータが乖離します。原因調査を終える前の「とりあえずの対処」としては使わないでください。

  • タスクを作り直してCDCを張り直す

    フルロードからやり直す場合、ターゲットの既存データの扱い(`TargetTablePrepMode`)と切り替え時間を先に決めてください。CDCの再設定は影響範囲が大きい作業です。

!注意事項

  • `ApplyErrorDeletePolicy = IGNORE_RECORD` は適用できなかった変更を黙って捨てます。エラー表示は消えますが、ソースとターゲットのデータは乖離します。この設定を入れる判断は、乖離を検証で追える状態にしてから行ってください。
  • `TargetTablePrepMode` を `DROP_AND_CREATE` にすると、フルロード時にターゲット表が削除・再作成されます。既存データは失われます。
  • 検証(validation)はソースとターゲットの双方に読み取り負荷をかけます。本番時間帯にいきなり有効化しないでください。
  • 制御テーブルの中身は移行対象データの一部(キー値やステートメント)を含みます。共有・エクスポートの際は取り扱いに注意してください。
  • DMSのタスク設定名はバージョンにより差があります。本記事に載っていない項目や名称が異なる項目があるため、必ず実タスクのJSONを確認してから編集してください。

バージョン・環境による違い

ターゲットがMySQL 8.0互換(Aurora MySQL 3.x)照合順序の既定が5.7系と異なるため、文字列を含む複合キーでの一致判定に差が出ることがあります。文字セットの差異は関連文書を参照してください。
DMSのバージョン差タスク設定として使える項目はDMSのエンジンバージョンによって増減します。本記事では確認できた項目のみを挙げており、衝突処理に関する追加設定の有無は `describe-replication-tasks` の出力で確認してください(要確認)。
制御テーブルのスキーマ`ControlSchema` を明示していないタスクでは配置先が環境により変わります。SQLを流す前に `information_schema.TABLES` で実配置を確認してください。

これで解決しない場合に確認すること

  • ソース側のbinlog保持時間を確認する

    保持が短くCDCが読み損ねていると、設定変更では解決しません。

  • DMSレプリケーションインスタンスのリソースを確認する

    CPU・メモリ・ストレージが逼迫していると、適用の遅延やタスク再開が増え、境界の問題が起きやすくなります。

  • ソース側のトリガーや外部キーによる連鎖更新を確認する

    ソースで連鎖的に更新される行がターゲットでは再現されない場合があります。

  • 1032 以外のエラーが混在していないか確認する

    重複キー(1062)などが同時に出ている場合、原因は別系統です。

  • 移行対象表の一覧とアプリケーションの書き込み経路を突き合わせる

    ターゲットに書いているのがDMSだけかを、設計ではなく実際の接続元で確認します。

この文書の根拠と限界

製品の公式ドキュメントに基づく説明

MySQLのエラーコード `1032`(`ER_KEY_NOT_FOUND`)の定義、AWS DMS の制御テーブル(`awsdms_apply_exceptions`、`awsdms_validation_failures_v1` ほか)とタスク設定(`ErrorBehavior`、`TargetMetadata`、`ValidationSettings`)の公開仕様に基づきます。設定項目の有無はDMSのバージョンに依存するため、実タスクのJSONでの確認を前提としています。特定顧客の移行事例は含みません。

よくある質問

Error 1032 の原因は何ですか?

MySQLの `ER_KEY_NOT_FOUND` で、UPDATEやDELETEを適用しようとした行がターゲットに存在しないという意味です。DMSのCDCでは、フルロードとCDCの境界での取りこぼし、主キーの不一致、主キーの無い表、フィルタによる行の除外、ターゲットへの他プロセスからの書き込みが主な原因です。

Productionで実行できますか?

制御テーブルとメタデータの参照SQLはすべて参照専用で、本番でも実行できます。タスク設定の変更はタスクの停止・再開を伴い、`IGNORE_RECORD` はデータ乖離を生むため、影響を確認したうえで実施してください。

どの権限が必要ですか?

制御テーブルの参照はターゲットDBの `SELECT` 権限、タスク設定の取得・変更はIAMの `dms:DescribeReplicationTasks` / `dms:ModifyReplicationTask` が必要です。

ApplyErrorDeletePolicy を IGNORE_RECORD にすれば解決しますか?

エラーは止まりますが、解決ではありません。適用できなかった削除を捨てるため、ソースとターゲットのデータが乖離します。原因を特定したうえで、乖離を許容できるかを判断してから設定してください。

結果をどう判断しますか?

`awsdms_apply_exceptions` のエラーが特定の表に偏っていれば、その表の主キー定義とマッピングを疑います。全表に散らばっていて時刻がタスク再開に集中しているなら、CDCの開始位置やbinlogの欠落を疑います。ソース側にだけ行が存在するならフルロードの取りこぼしです。

主キーが無い表はどうすればよいですか?

CDCの対象にするなら主キーまたは一意キーを用意するのが原則です。用意できない場合は、その表だけフルロードの繰り返しで同期する、あるいは移行対象から外して別手段で扱う、といった設計変更を検討してください。

この文書がカバーする質問

  • DMSのCDCでUPDATEが適用できずタスクが止まる
  • awsdms_apply_exceptions の読み方が知りたい
  • 主キーの無いテーブルをDMSでCDC移行できるか
  • DMSの検証(validation)で不一致が出たときの調べ方

リスク表示の意味

  • 参照のみデータと設定を変更しません。
  • 影響は限定的ですが、権限と負荷の確認が必要です。
  • 性能・ロック・コストに影響する可能性があります。
  • 障害・データ損失・復旧作業が発生する可能性があります。
  • 専門家レビュー必須本番適用前に別途レビューが必須です。

GIIPの対応範囲

Error 1032 の1件を追うだけなら制御テーブルを読めば足ります。運用として難しいのは、移行期間中ずっとタスクの状態と乖離の有無を見続けることです。GIIPでは、DMSタスクの状態・エラー件数・検証結果の推移を定期収集し、エラーが出た時点の制御テーブルの内容をあわせて保全しています。切り分けと一次報告まではAIエージェントが行い、`IGNORE_RECORD` のようにデータ乖離を伴う判断が必要な場面では、必ず人の承認を挟む運用にしています。

執筆・技術検証

GIIP プロダクション運用チーム

大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

DMSタスクのエラー調査を依頼する

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

DMSタスクのエラー調査を依頼する

ナレッジベース一覧へ