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

perconaの読み方

f:id:miyachik:20170523195851p:plain https://www.quora.com/How-do-you-pronounce-Percona