• MySQLでALTER TABLEでINDEXを作成するときの注意事項

    こんにちは。Ops側の小宮です。
    ある日朝来たら突然開発の方から相談いただいたので、後のために記録しておこうと思います。

    相談内容:
    jenkinsで本番デプロイを行ったが、処理を途中停止した。
    (CakeのDBマイグレーションスクリプトでデプロイした)
    KEYカラムにINDEXをはろうとしたがDBの応答がなくなり接続できなくなった。
    結果としてテーブルが破損したためRDSの時刻指定してロールバックする機能を用いた。
    (ALTERが終わってたかどうかとかはロールバックしたので不明)
    同じレコード数の試験環境で同じ操作をしたら特に異常なくすんなり終わった。
    もう一回同じことを本番でやりたいけどどうしましょう。
    MySQLのバージョンは5.5.27。

    私の個人的認識:
    普通、ALTERする時はロックがかかるから、
    事前に同じ構成と件数の試験環境でかかる時間を見積もってから
    その時間サービス止めてメンテ入れるべきです。
    (※5.5まで。5.6から一部のALTERはオンラインで大丈夫になったようです。)
    sorry表示に切り替えて更新のない環境でやってみましょう。
    (既存のELBの下のwebを全部はずして、別のサブドメインのwebにvhost切ってsorryコンテンツおいてELBに入れるとか)
    途中で強制終了とかするとMyISAMだとテーブル壊れやすそう。
    show full processlist;で現在のクエリとかかってる時間は見ることができる
    けどkillするのは最終手段かと。

    alter table mysqlとか、それプラス5.6とかでググると色々わかります。

    sh2さんのブログを見ると、以下のように書かれています。
    MySQLでALTER TABLE文の進捗状況を確認する - SH2の日記
    -————— MySQLでは
    変更後の定義にもとづく作業用テーブルを作成し、
    変更前のテーブルから作業用テーブルへデータをコピーして、
    最後に二つのテーブルを入れ替えるという仕組みになっています。
    テーブルへのインデックス追加についても、現在のところ大半の
    ケースで内部的にALTER TABLE文が実行されています。

    どこまですすんでるのか確認する方法:
    SHOW GLOBAL STATUS LIKE ‘Handler_write’;
    作業開始前にHandler_writeの値と対象テーブルのレコード件数を控えておけば、
    どこまで処理が進んだのかを確認することができるのです。

    InnoDBならinnotopをつかうと、row operationsのビューにズバリIns/Secがあるので、
    同様にしてALTER TABLEの完了予想が立てられますね。
    差を自分で計算しなくてもいいし、標準的なツールなので便利
    -—————

    ...