gh-ostツールの紹介と活用方法

概要

gh-ostはGitHubが開発したオンラインDDL(Online Data Definition Language)変更ツールで、MySQLデータベース専用です。このツールはテーブルをロックすることなくデータベーススキーマの変更を実行でき、従来のALTER TABLEコマンドが引き起こす可能性のある長時間のテーブルロック問題を回避します。これは、高可用性が厳しく要求される本番環境において特に重要です。

このツールはトリガーなし(trigger-less)の方式でテーブル構造の変更を実現し、データベースへの性能影響を軽減します。同時に、一時停止、速度制限、動的設定機能などをサポートしています。従来のpt-online-schema-changeと比較して、gh-ostはより安全で柔軟であり、マスターデータベースへの負荷も低くなります。

主な特徴

  • テーブルロックなし操作:従来のALTER TABLEとは異なり、gh-ostはテーブルを長時間ロックしないため、本番環境でのDDL変更がより安全になります。
  • レプリケーションに基づく移行:gh-ostはスレーブからバイナリログを読み取って変更を適用するため、マスターデータベースへの負荷を軽減します。
  • 柔軟な制御方法:速度制限の動的調整、操作の一時停止/再開などをサポートします。
  • シミュレーションと事前チェック機能:dry-runオプションで変更効果をテストし、pre-flight checksで操作の安全性を確保します。
  • 使いやすさ:機能が豊富であるにもかかわらず、比較的簡単で、DBAや技術者にとってすぐに使いこなせるようになっています。
  • トリガーなし設計:データベーストリガーに依存せず、MySQLのbinlogを解析してデータ変更を同期するため、マスターデータベースの負荷と潜在的なロック競合を減らします。
  • 多様な実行モード:マスター(master)またはレプリカ(replica)に接続でき、要件に応じて異なる移戦略を選択できます。

インストール方法

バイナリファイルのダウンロード

GitHubリポジトリから対応するプラットフォームのバイナリファイルをダウンロードします:
https://github.com/github/gh-ost/releases

実行権限の付与

chmod +x gh-ost

基本的な使用方法

コマンド形式

gh-ost \
  --host=<マスターDBのホスト> \
  --port=<マスターDBのポート> \
  --user=<ユーザー名> \
  --password=<パスワード> \
  --database=<データベース名> \
  --table=<テーブル名> \
  --alter=<DDL文> \
  --execute

主要パラメータの説明

パラメータ 説明
--alter 実行するDDL文(例: ADD COLUMN, DROP INDEXなど)
--execute 実際に移行を実行(デフォルトはdry-runモード)
--allow-on-master マスターデータベースへの直接接続を許可(デフォルトはレプリカに接続)
--max-load=<メトリクス> 負荷しきい値の設定(例: Threads_running=50)
--chunk-size=<行数> 1回の移行で処理するデータブロックのサイズ(デフォルト1000)
--critical-load=<メトリクス> 負荷がしきい値を超えた場合に操作を終了
--switch-to-rbr 自動でレプリカのbinlog形式をROWに変更
--postpone-cut-over-flag-file=<パス> ファイルを通じてテーブルの切り替えを遅延させるかどうかを制御
--throttle-control-replicas 監視対象のレプリカリストを指定
--tmpdir 一時ファイルのディレクトリを指定

使用例

1. 新しい列の追加

gh-ost \
  --host=127.0.0.1 \
  --port=3306 \
  --user=admin \
  --password=secret \
  --database=mydb \
  --table=orders \
  --alter="ADD COLUMN comment VARCHAR(255)" \
  --execute

2. フィールドタイプの変更

gh-ost \
  --alter="MODIFY COLUMN amount DECIMAL(10,2)" \
  --host=127.0.0.1 \
  --execute

3. インデックスの追加

gh-ost \
  --alter="ADD INDEX idx_created_at (created_at)" \
  --host=127.0.0.1 \
  --execute

4. マスターの切り替え

マスターのフェイルオーバー時に動的な切り替えをサポート:

gh-ost \
  --assume-master-host=<新しいマスターのホスト:ポート> \
  --execute

注意事項

権限要件

  • SUPER、REPLICATION SLAVE、REPLICATION CLIENT権限が必要です。
  • 元のテーブルと一時テーブルに対してCREATE、DELETE、ALTER権限が必要です。

主キーの必須

対象テーブルには主キーまたは一意インデックスが存在する必要があります。

外部キーとトリガー

gh-ostは外部キー制約またはトリガーを持つテーブルをサポートしません。

大規模テーブルの操作

大規模なテーブルの移行では、ディスクスペース(一時テーブルが追加スペースを占有)とネットワーク負荷に注意が必要です。

タグ: MySQL DDL データベース スキーマ変更 gh-ost

6月24日 23:11 投稿