🤔

AuroraでCREATE TABLEしたら「そんなテーブルはない」って怒られた。え?そんなことある?

2024/04/02に公開

概要

AuroraでCREATE TABLEしたら以下のエラーが出ました。

Error: Table hoge_table doesn't exist

今から作ろうとしてるテーブルなのでそりゃないんだけど
それでエラーでテーブル作成できないって、そんなことある?w
という感じで困り果てたので原因と対策を書いていきます!

環境

Aurora(2.12.1)

そもそもどんな処理をしているの?

ある高頻度でアクセスされるテーブル(仮にhoge_tableとします)がありました。
hoge_tableはデータが溜まりやすく定期的ローテーション(古いデータを捨てる)必要がありました。
DELETE文だと非常に重たいことから以下の手順を踏んでいました。

  1. まずhoge_tableをhoge_table_backupにRENAME
  2. 次にhoge_tableをCREATE TABLE

こうすることでバックアップを取りつつデータをローテーションしていました。
※ちなみに一瞬hoge_tableがない状態が発生してしまうため、そこは「SELECT打ってテーブルがなかったらリトライする」という機構を用意して対策してありました。

この2の手順のCREATE TABLEにて本題のエラーが発生していました。

create_table_before

原因

同じ処理がRDSでは問題ないことからAuroraの不具合ではないか?ということでAWSに問い合わせをしました。
以下回答の一部抜粋です。

CREATE TABLE 予定のテーブル名に対して高頻度で SELECT クエリを発行している状況下で CREATE TABLE を実施することで事象が再現可能なことを確認しております。

今から作ろうとしているテーブルに対して高頻度でSELECTクエリが打たれている状態だと発生する不具合ということでした。
そもそも普通に使ってたらこの状況になること自体がレアケースですねw

対策

いきなりテーブルを作らずに一旦tmpのテーブルを作ることで回避できました!

  1. まずhoge_tableをhoge_table_backupにRENAME
  2. 次にhoge_table_tmpをCREATE TABLE
  3. hoge_table_tmpをhoge_tableにRENAME

高頻度にSELECTクエリを打たれている状態でCREATE TABLEはできないけどRENAMEならできるみたいでした。

create_table_after

まとめ

今回は元々の処理が結構特殊な使い方をしているために起きたレアケースな不具合でした。
高頻度にSELECTを打たれているようなテーブルを作り直す時はRENAME方式にしましょう!
それでは良いAuroraライフを!

NE株式会社の開発ブログ

Discussion