Skip to main content

オンラインスキーママイグレーション稼働したままスキーマ変更を当てる。すべてのエンジンで。

オンラインスキーママイグレーションは 1 つの問題ではなく 2 つの問題です。エンジンが ALTER の取るロックを決め、デプロイがそのロックが許容できないときの打ち手を決めます。

オンラインスキーママイグレーションのアーキテクチャ

2 つのレイヤー。1 つの結果。

エンジン層

ALTER を実行したときに DB がネイティブに何をするか。MySQL は INSTANT、INPLACE、COPY のいずれかを選び、Postgres はロックモードを取ります。各エンジンが — 静かに — 書き込みをブロックするのか、レプリカを失速させるのか、ミリ秒で終わるのかを決めます。

デプロイ層

エンジン単独では足りないときに手を伸ばす道具。gh-ost と pt-online-schema-change はシャドーテーブルを別経路の書き込みで保ちます。Blue-Green は 2 つの DB を同期させトラフィックを切り替えます。どちらもエンジンがオンラインでできない変更を可能にしますが、代償として 2 系統を走らせることになります。

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 デプロイです。

シリーズのすべての投稿。

データベース開発のスタンダードを体験する