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 |
そのまま実行できるコマンド
- 対象
- 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で実際の配置を確認してから次のクエリのスキーマ名を置き換えてください。
- 対象
- 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句に出ている値が、ターゲットに存在しなかったキーです。
- 対象
- 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` が異なる場合も同様です。
- 対象
- 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;ソースにあってターゲットに無ければ、フルロードの取りこぼしかフィルタによる除外です。両方に無ければ、既に削除済みの行に対する遅れた変更が来ている(順序の問題)と判断できます。
- 対象
- 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 textDMSのタスク設定はバージョンによって使える項目が異なります。記事の設定名をそのまま信じず、このコマンドで実タスクの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` に大量の行が入った
考えられる原因(可能性の高い順)
01
フルロードとCDCの境界で対象行がターゲットに入っていない
フルロード開始時点のスナップショット以降に挿入され、その後更新・削除された行は、CDCで先に更新が届いてもターゲットに存在しないことがあります。タスク開始位置とフルロード完了時刻の関係を確認してください。
02
ソースとターゲットで主キー・一意キーが一致していない
ターゲット側だけ主キー列が異なる、あるいは主キーを張り替えている場合、DMSが生成するWHERE句が対象行に当たりません。両側で `KEY_COLUMN_USAGE` を突き合わせてください。
03
ターゲット表に主キーが無い
主キーが無いとDMSは全列一致で対象行を探します。浮動小数点や文字コードの差、LOB列の扱いによって一致せず、1032 になります。CDC対象の表には主キーまたは一意キーを用意するのが前提です。
04
選択ルール・変換ルールで行や列が除外されている
テーブルマッピングのフィルタで一部の行だけを移行している場合、対象外の行に対する更新がCDCで届き、ターゲットに存在せずエラーになります。列のリネームや除外も同じ影響を与えます。
05
ターゲット側を別のプロセスが更新している
アプリケーションや別のDMSタスク、バッチがターゲットに書き込んでいると、DMSが前提とする行の状態が崩れます。移行中のターゲットは書き込みをDMSに限定するのが原則です。
06
binlogが必要な期間より早く削除され、変更が欠落した
ソース側のbinlog保持時間が短いとCDCが読み損ね、再開時に整合しない状態から適用が始まることがあります。保持時間の確認は関連文書を参照してください。
確認手順
- 1
エラーの実体を制御テーブルで確認する
参照のみ`awsdms_apply_exceptions` を時刻降順で読み、対象表・ステートメント・キー値を特定します。参照のみで安全です。
- 2
CloudWatch Logsでタスクログを確認する
参照のみ`dms-tasks-<レプリケーションインスタンス名>` ロググループで、エラーの前後に何が起きていたか(再開、テーブル一時停止、接続断)を確認します。
- 3
ソースとターゲットの主キー定義を突き合わせる
参照のみ上記のメタデータSQLを両側で実行し、`pk_columns` が一致しているか、NULL の表がないかを確認します。
- 4
該当キーの行の存在をソース・ターゲット双方で確認する
参照のみどちらに存在するかで、取りこぼしなのか順序の問題なのかが決まります。
- 5
タスクのテーブルマッピングと設定JSONを確認する
参照のみ`describe-replication-tasks` で実際の設定を取り出し、フィルタ・変換ルール・`ErrorBehavior` の現在値を確認します。
- 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を確認してから編集してください。
バージョン・環境による違い
これで解決しない場合に確認すること
ソース側の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エージェントと人間の専門家が継続的に監視・運用しています。
Aurora MySQLでbinlogの保持時間を確認・設定する方法
binlogの保持時間は `mysql.rds_show_configuration` で確認し、`mysql.rds_set_configuration` に時間単位で設定します。binlog_formatはクラスターパラメータで、変更には再起動が必要です。
database-migration3TB規模のデータベースを移行するときの計画の立て方
3TB級の移行計画は、サイズの実測、切り替え方式の選択、試験実行による所要時間の実測、検証と切り戻しの設計、の順で組み立てます。目安値ではなく実測値で日程を引くための手順です。
sql-serverSQL ServerのCDCでログスキャンが止まっていないか確認する方法
sys.dm_cdc_log_scan_sessions と cdc.lsn_time_mapping、キャプチャジョブの状態から、CDCのログスキャンが進んでいるかを確認する手順です。
tidbTiDBからAurora MySQLへ移行するときに確認する項目
TiDBはMySQL互換ですが同一ではありません。主キー・採番・トランザクション・統計・容量の各差分を、確認用SQLとともに移行前チェックリストとして整理します。
関連サービス
DMSタスクのエラー調査を依頼する
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
DMSタスクのエラー調査を依頼する