MySQL5.6からは無停止でALTER TABLEできるオンラインDDLが実装されましたが、いくつかある制約に引っかかって利用できませんでした。
Percoana Toolkitのpt-online-schema-changeを使うと、オンラインDDLの制限に引っかかる場合や
MySQL5.5以前でも無停止でALTER TABLEできます。
- インストール(CentOSの場合)
yum install perl-TermReadKey wget https://www.percona.com/downloads/percona-toolkit/2.2.17/RPM/percona-toolkit-2.2.17-1.noarch.rpm rpm -ivh percona-toolkit-2.2.17-1.noarch.rpm
- 動作確認
pt-online-schema-change --dry-run --set-vars="sql_log_bin=0" --alter "ENGINE=InnoDB" -h=localhost,D=database_name,t=table_name
上記コマンドの–dry-runを–executeに置き換えるとスキーマ変更が実行されます。
- 仕組み
- + スキーマ変更対象テーブルをコピーして作業テーブルを作成
- + 元テーブルにINSERT/UPDATE/DELETEトリガーを追加して元テーブルの変更が作業テーブルにも反映されるようにする
- + 作業テーブルにALTER TABLEを適用する
- + RENAMEで元テーブルと作業テーブルをいれかえる
- + 元テーブルとトリガーを削除して完了
- 注意事項
- – 作業テーブルをコピーして作るので、CPUやDisk I/O負荷が高い。
- – ALTER対象テーブルをコピーして作業テーブルが作成されるので、ストレージに余裕が必要
- – 普通にALTER TABLEするより時間がかかる
- – 普通に実行するとレプリケーション遅延が発生する
参考
http://d.hatena.ne.jp/fat47/20140418/1397811745
http://d.hatena.ne.jp/fat47/20140421/1398049276