AWS Database Migration Serviceで「Table has no partition for value」エラーが出てレプリケーションが進行されない場合の対処方法【MySQL】

AWS

2023.5.24

Topics

概要

「AWS Database Migration Service」通称「AWS DMS」を使用し、MySQL5.7系をAurora MySQL8系互換へ移行していた所、フルロード+CDCのデータベース移行タスク状態が「ロード完了 レプリケーション進行中」となっているにも関わらず、データベース内のデータが更新されていない状況となりました。
今回はこの原因を特定し、正常に同期される状態までの対処方法をご紹介します。

エラーの確認

CloudWatch Logsを確認した所、以下のエラーコードの出力を確認しました。

RetCode: SQL_ERROR  SqlState: HY000 NativeError: 1526 Message: [MySQL][ODBC 8.0(w) Driver][mysqld-8.0.23]Table has no partition for value from **** [1022502]  (ar_odbc_stmt.c:2738)

どうやら、移行元テーブルにはあるパーティションが移行先テーブルには存在していないようです。
DMSは一部のDDL文の移行をサポートしていますが、パーティション作成の移行はサポートされていません。

対象テーブルの特定

まずは、どのテーブルのパーティションに差異があるのかを特定します。
以下のクエリを移行元・移行先双方のDBで実行し結果を確認します。

SELECT table_name,max(partition_name)  FROM INFORMATION_SCHEMA.PARTITIONS WHERE table_schema = DB名 GROUP BY table_name ORDER BY table_name;

上記クエリで得た結果を比較します。
なお、今回はRANGEパーティションを使用していた場合と仮定して執筆しています。
例えばそれぞれ以下の様な出力だったとします。

  • 移行元DB
テーブル(table_name) パーティション名(partition_name)
table_a
table_b p10
table_c p4
  • 移行先DB
テーブル(table_name) パーティション名(partition_name)
table_a
table_b p10
table_c p2

「table_c」のパーティションに差異がある事になります。

エラーの解決

先ほどの例ですと、「table_c」のパーティションに差異がありました。
移行先DBで新たにパーティションを追加する事により解決します。

対象テーブルのCREATE文を確認の上、適切にパーティションを追加します。

SHOW CREATE TABLE テーブル名 ;

例えば以下のSQL文でパーティションを追加する事で解決されます。

ALTER TABLE table_c ADD PARTITION (
  PARTITION p3 VALUES LESS THAN (100) ENGINE = InnoDB
, PARTITION p4 VALUES LESS THAN (200) ENGINE = InnoDB);

※LESS THANの値については、お使いのテーブル設計に合わせて設定して下さい。

予防策

今回の例ですと、予め移行元テーブルでMAXVALUEパーティションを追加しておく事で、本エラーの予防策ともなります。
1つのテーブルのパーティション差異があると、全テーブルの同期が止まってしまうので要注意です。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

ysnb-mori

2018年に新卒で入社し、運用チームを経てセールスエンジニアとして日々奮闘中です。初めて触ったOSはSolarisでした。多肉植物を無限に増やすのが趣味です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら