AWS Database Migration Serviceで「Table has no partition for value」エラーが出てレプリケーションが進行されない場合の対処方法【MySQL】
概要
「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に関するお役立ち情報を配信中!
Follow @twitter2018年に新卒で入社し、運用チームを経てセールスエンジニアとして日々奮闘中です。初めて触ったOSはSolarisでした。多肉植物を無限に増やすのが趣味です。
Recommends
こちらもおすすめ
-
Amazon RDS で推奨事項を表示する機能がリリースされました
2023.12.28
-
Mountpoint for Amazon S3のパフォーマンス検証
2023.12.13
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16