概要
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は外部キー制約またはトリガーを持つテーブルをサポートしません。
大規模テーブルの操作
大規模なテーブルの移行では、ディスクスペース(一時テーブルが追加スペースを占有)とネットワーク負荷に注意が必要です。