オンラインスキーママイグレーション稼働したままスキーマ変更を当てる。すべてのエンジンで。
オンラインスキーママイグレーションは 1 つの問題ではなく 2 つの問題です。エンジンが ALTER の取るロックを決め、デプロイがそのロックが許容できないときの打ち手を決めます。
オンラインスキーママイグレーションのアーキテクチャ
2 つのレイヤー。1 つの結果。
エンジン層
ALTER を実行したときに DB がネイティブに何をするか。MySQL は INSTANT、INPLACE、COPY のいずれかを選び、Postgres はロックモードを取ります。各エンジンが — 静かに — 書き込みをブロックするのか、レプリカを失速させるのか、ミリ秒で終わるのかを決めます。
デプロイ層
エンジン単独では足りないときに手を伸ばす道具。gh-ost と pt-online-schema-change はシャドーテーブルを別経路の書き込みで保ちます。Blue-Green は 2 つの DB を同期させトラフィックを切り替えます。どちらもエンジンがオンラインでできない変更を可能にしますが、代償として 2 系統を走らせることになります。
オンラインスキーママイグレーションガイド
順番に読む。
- 01
MySQL Online DDL から始める
INSTANT、INPLACE、COPY — それぞれが何を書き換え、何をロックし、MySQL がどんなときにフォールバックするか。
- 02
COPY のコストが高すぎるなら gh-ost
10 億行のテーブルでは MySQL の COPY フォールバックは数時間かかり、レプリカも失速する。gh-ost は binlog を読み、シャドーテーブルを構築し、入れ替える。
- 03
Postgres は仕組みが違う
ロックモデルが違えばプレイブックも変わる。順序を正しく組み立てれば、ほとんどの ALTER は補助無しでオンラインに走る — もし必要になっても Postgres 版の gh-ost は存在しない。
MySQL のオンラインスキーママイグレーション
MySQL。
MySQL はオンラインマイグレーションのツール群が最も豊富です — 3 つのネイティブアルゴリズムに加え、gh-ost と pt-online-schema-change が GitHub、Percona、そしてその後の運用者たちによって 10 年以上鍛えられてきました。
MySQL Online DDL
INSTANT、INPLACE、COPY — それぞれのコストと、MySQL がいつ静かに最遅の方式へ落ちるか。
読む →スキーママイグレーションのベストプラクティス
運用面: いつバッチに分けるか、いつスロットルするか、レプリカをどう揃えるか。
読む →gh-ost オンラインスキーママイグレーション
GitHub の binlog 駆動シャドー & カットオーバーツール。Online DDL が COPY に落ちるときの一手。
読む →gh-ost vs pt-online-schema-change
Online DDL では手に余るなら、binlog ベースの gh-ost とトリガベースの pt-osc から選ぶ。
読む →
Bytebase のオンラインスキーママイグレーション
マイグレーションをレビュー、順序付け、適用。
Bytebase はスキーマ変更を実行前にレビューし、環境をまたいで順序付け、テーブルサイズとポリシーに基づいて Online DDL と gh-ost を自動で選びます。エンジン側の経路もデプロイ側の経路も 1 つのワークフローで — DB の周りに独自のマイグレーションツールを書く代わりに。
1 つのワークフロー。すべてのエンジン。
オンラインスキーママイグレーションに関する質問
よくある質問。
- オンラインスキーママイグレーションとは?
- スキーマ変更 — カラム追加、新しい索引、型の拡張 — を、データベースが読み書きを処理し続けたままで適用すること。落とし穴は、たいていのエンジンが ALTER のどこかで何かをロックすることです。「オンライン」は「ロックが一切ない」ではなく、「ロックが短く許容できる」を意味します。
- MySQL の Online DDL と gh-ost / pt-online-schema-change はどう使い分けるか?
- まず Online DDL から始めましょう — 無料で、エンジンに同梱され、INSTANT や INPLACE で大半のケースをカバーします。問題は COPY です。MySQL は他のアルゴリズムでインプレースにできない操作になると静かに COPY に落ち、大きなテーブルでは数時間の再構築とレプリカ遅延を生みます。そこで gh-ost や pt-online-schema-change の出番です。まず gh-ost の制限の記事を読んでください — どちらも外部キー、生成カラム、特定のレプリケーション構成で角があります。
- Postgres には gh-ost のような外部ツールが必要か?
- 通常は不要 — ただしこれはツール側のギャップで、エンジンが優れているからではありません。Postgres には gh-ost や pt-online-schema-change と同等の汎用ツールは成熟していません。pg_repack や pg_squeeze はテーブル再構成をカバーしますが、書き込みを続けたまま任意の ALTER を再生するわけではありません。実際に成り立つのは、ほとんどの Postgres の ALTER が順序を正しく組み立てればネイティブにオンラインで進むからです — NULL 許容のカラム追加、`CREATE INDEX CONCURRENTLY`、互換ステップへの分割など。ネイティブにオンラインにできない変更のフォールバックは、Postgres 版 gh-ost ではなく Blue-Green デプロイです。
シリーズのすべての投稿。
MySQL。
- 01
MySQL Online DDL: 実践ガイド
代表的な ALTER の動作例と、MySQL が実際に選ぶアルゴリズムを対応付ける。
- 02
MySQL スキーママイグレーションのベストプラクティス
運用面の現場検証済みチェックリスト — ロック時間、レプリカ遅延、バッチ。
- 03
gh-ost による MySQL オンラインスキーママイグレーション
gh-ost が binlog を読み、シャドーテーブルを構築し、新スキーマへアトミックに切り替えるしくみ。
- 04
gh-ost vs pt-online-schema-change
トリガベース vs binlog ベース。カットオーバー競合、外部キー、ランタイム制御、再開可能性。
- 05
本番に出す前に知っておくべき gh-ost の制限
外部キー、生成カラム、レプリケーション構成 — 本番で動かす前にハマりがちな点。