重いALTER TABLEの実行中に進捗状況を確認する方法

メディア統括本部 サービスリライアビリティグループ(SRG)の鬼海雄太(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、MySQLにて重いALTER実行中に進捗状況を確認する方法についてまとめている記事になります
なにかの役に立てば幸いです。
 

MySQLで重いALTER実行がどれぐらいで終わるか見積もりたい


MySQLの巨大なデータサイズのテーブルに対してカラムの変更など重いALTERを実行する際、
あとどれぐらいで終わりそうなのか。今どの処理をしているのかなどを知りたいことがあると思います。

Performance Schemaの情報から確認可能になりました


Performance Schemaの歴史は古く、MySQL5.5の時代からリリースされておりバージョンアップごとに機能が拡充されてきました。
今回performance_schemaの2テーブルである
  • setup_instrumentsテーブル
  • setup_consumersテーブル
から進捗状況を確認していきます。

setup_instrumentsテーブル

どの情報を取得するかを制御しているテーブルです。
下記のようにwaitだったりstageだったりtransaction,memoryの情報が取れることがわかります。
stageはクエリ実行中どこのステージの処理をしているのかの情報になります。
 
今回はALTER実行中の情報を取得したいので、以下の項目がENABLEDになっているか確認します。
現在のMySQLではデフォルトでENABLEDになっているかと思います。

setup_consumersテーブル

パフォーマンス情報の収集と保存を制御するテーブルです。
 
今回はこれらの項目が有効になっているか確認します。
 

events_stages_current

現在実行中のステージイベントの情報を収集。

events_stages_history

最近終了したステージイベントの履歴を保持

events_stages_history_long

より長期的なステージイベントの履歴を保持
 
デフォルトで無効なので、有効化しましょう。
 
より詳細はMySQL公式ドキュメントのパフォーマンススキーマのページをご参照ください。
 

ALTER実行中の進捗を確認する


重いALTERのクエリを実行中に以下のクエリで確認ができます。
  • EVENT_NAME(実行中クエリがどのステージにいるか)
  • WORK_COMPLETED(ステージで完了した作業単位の数)
  • WORK_ESTIMATED(ステージで予想される作業単位の数)
 
WORK_COMPLETEDの値がWORK_ESTIMATEDに近づくほど、完了が近いということがわかります。
定期的に数値を確認することで、あとどれぐらいで完了しそうかを見積もることが可能です。
 

終わりに


重いALTERの実行をシステムメンテナンス中に実行する際など、あとどれぐらいで終わるかわからずドキドキしたことがあります。
今回の方法を使うことで少し安心できる材料になるかなと思うので活用していきたいですね。
 
SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
 
このエントリーをはてなブックマークに追加