AuroraでCREATE TABLEしたら「そんなテーブルはない」って怒られた。え?そんなことある?
概要
AuroraでCREATE TABLEしたら以下のエラーが出ました。
Error: Table hoge_table doesn't exist
今から作ろうとしてるテーブルなのでそりゃないんだけど
それでエラーでテーブル作成できないって、そんなことある?w
という感じで困り果てたので原因と対策を書いていきます!
環境
Aurora(2.12.1)
そもそもどんな処理をしているの?
ある高頻度でアクセスされるテーブル(仮にhoge_tableとします)がありました。
hoge_tableはデータが溜まりやすく定期的ローテーション(古いデータを捨てる)必要がありました。
DELETE文だと非常に重たいことから以下の手順を踏んでいました。
- まずhoge_tableをhoge_table_backupにRENAME
- 次にhoge_tableをCREATE TABLE
こうすることでバックアップを取りつつデータをローテーションしていました。
※ちなみに一瞬hoge_tableがない状態が発生してしまうため、そこは「SELECT打ってテーブルがなかったらリトライする」という機構を用意して対策してありました。
この2の手順のCREATE TABLEにて本題のエラーが発生していました。
原因
同じ処理がRDSでは問題ないことからAuroraの不具合ではないか?ということでAWSに問い合わせをしました。
以下回答の一部抜粋です。
CREATE TABLE 予定のテーブル名に対して高頻度で SELECT クエリを発行している状況下で CREATE TABLE を実施することで事象が再現可能なことを確認しております。
今から作ろうとしているテーブルに対して高頻度でSELECTクエリが打たれている状態だと発生する不具合ということでした。
そもそも普通に使ってたらこの状況になること自体がレアケースですねw
対策
いきなりテーブルを作らずに一旦tmpのテーブルを作ることで回避できました!
- まずhoge_tableをhoge_table_backupにRENAME
- 次にhoge_table_tmpをCREATE TABLE
- hoge_table_tmpをhoge_tableにRENAME
高頻度にSELECTクエリを打たれている状態でCREATE TABLEはできないけどRENAMEならできるみたいでした。
まとめ
今回は元々の処理が結構特殊な使い方をしているために起きたレアケースな不具合でした。
高頻度にSELECTを打たれているようなテーブルを作り直す時はRENAME方式にしましょう!
それでは良いAuroraライフを!
NE株式会社のエンジニアを中心に更新していくPublicationです。 NEでは、「コマースに熱狂を。」をパーパスに掲げ、ECやその周辺領域の事業に取り組んでいます。 Homepage: ne-inc.jp/
Discussion