AWS AuroraのリードレプリカでViewを使ったTableのswitchをしていてエラーになった話
MySQL(RDS)で運用していたシステムを、
AWSのAuroraに移行してエラーになった点があったのでノートを残しておきます。
ECサイトなどで、商品マスタなどを日次バッチ処理で切り替える時。
実体のテーブルは日ごとのテーブルを用意して、
サイト側のクエリにはviewを参照させることはよくあると思います。
SQLで書くと以下のような感じ。
2月13日のテーブル切り替え:
create table products_20160213(id integer, name varchar(255));
create or replace view products as select * from products_20160213;
drop table products_20160213;
2月14日のテーブル切り替え:
create table products_20160214(id integer, name varchar(255));
create or replace view products as select * from products_20160214;
drop table products_20160213;
このような処理をMySQL(マスター→リードレプリカ構成)で行っていたのものを、
Aurora(マスター/リードレプリカ構成)に置き換えたら、
テーブル切り替えのタイミングで以下のようなエラーが出るようになってしまいました。
Table 'products_20160213' doesn't exist
Auroraの説明を読むと、
『Amazon Aurora レプリカはソースインスタンスと基盤となるストレージを共有』
と書かれているので。
参考:
https://aws.amazon.com/jp/rds/aurora/
恐らく、
MySQLの場合:
- 変更前(products→products_20160213)
- マスターでビューを変更(products→products_20160214)
- マスターでテーブルを削除(products_20160213)
- (マスターから同期)リードレプリカでビューを変更(products→products_20160214)
- (マスターから同期)リードレプリカでテーブルを削除(products_20160213)
Auroraの場合:
- 変更前(products→products_20160213)
- マスターでビューを変更(products→products_20160214)
- マスターでテーブルを削除(products_20160213)
= 共有しているストレージから削除
= リードレプリカ側からも見えなくなる - (マスターから同期)リードレプリカでビューを変更(products→products_20160214)
ということが起こっていて、
3〜4の間にビューが参照するテーブルが見つからなくなっているのだと思われます。
対処としては、
直前のテーブルではなく2世代前のテーブルをdropするよう変更すれば良いわけですが。
MySQLと同じように使えるとは言うものの、
どうしても、こういう微妙な違いはあるなぁと思いました。