AWS Auroraをpt-online-schema-changeでオンラインscheme更新する
レコード数の多いテーブルに対してALTER TABLEしたい時ってありますよね、でも普通にALTER TABLEとかやるとロックがかかってしまって書き込みができないので、今回はpt-online-schema-changeを使いました。(逆に他のプロダクトはどうやってるかは聞いてみたいです) 色々制約がある場合には実行できないです。–dry-runオプションで確認が可能。 https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
MySQL5.6以降からのOnlineDDLとの使い分け参考:
- 原則 pt-online-schema-change
- 色々オプションが付けられて融通がきく
- Auroraなのでストレージの心配は一応無し?
https://yoku0825.blogspot.jp/2015/12/pt-online-schema-change56-innodbalter.html
仕組み
内部でやっていることは
- 対象のテーブルと同じ構造のテーブルを作る
- コピー先のテーブルにALTER文を適応
- コピー元テーブルに対して、TRIGERを作成し、差分が反映されるようにする
- テーブルのデータコピーの開始
- コピー先テーブルをRENAMEしてテーブルを入れ替える
- 後処理(TRIGERやコピー元テーブルの削除)
参考: http://ameblo.jp/principia-ca/entry-12129289966.html
やる
今回はローカルのMacにいれてトンネルを掘ってpt-online-schema-changeしました。
$ brew install percona-toolkit $ ssh -f -N -L 3307:${RDS_HOST}:3306 -i ~/path/to/${ENV}.pem ec2-user@${PROXY_HOST} mysql -u ${USER} -P 3307 -h 127.0.0.1 -p ${DATABASE} $ pt-online-schema-change --alter='じっこうしたいALTER文;' h=127.0.0.1,P=3307,u=${DB_USER},p=${DB_PASSWORD},D=${DATABASE},t=${TABLE}
これでログがでてくるので終わり、オプションは適宜。 centosにも簡単に入れられるので踏み台鯖からやったりしても良いと思います。 トンネルのやつはこれを参考: https://cloudpack.media/9675