2016年の編集: 最近(2016年8月)gh-ost
をリリースしました 、それを反映するように私の答えを修正します。
今日、MySQLのテーブルをオンラインで変更できるツールがいくつかあります。これらは次のとおりです。
- 2016年の編集: gh-ost :GitHubのトリガーレススキーマ移行ツール(免責事項:私はこのツールの作成者です)
- oak-online-変更テーブル 、openark-kitの一部として (免責事項:私はこのツールの作成者です)
- pt-online-schema-変更 、 Percona Toolkitの一部として
- Facebookの
オンラインスキーマの変更MySQLの場合
「通常の」`ALTERTABLE`について考えてみましょう:
大きなテーブルはALTER
に時間がかかります 。 innodb_buffer_pool_size
重要であり、他の変数も重要ですが、非常に大きなテーブルでは、それらはすべて無視できます。時間がかかるだけです。
MySQLがALTER
に対して行うこと テーブルとは、新しい形式で新しいテーブルを作成し、すべての行をコピーしてから切り替えることです。この間、テーブルは完全にロックされています。
独自の提案を検討してください:
ほとんどの場合、すべてのオプションの中で最悪のパフォーマンスを示します。何故ですか? InnoDBテーブルを使用しているため、INSERT INTO tablename_tmp SELECT * FROM tablename
トランザクションになります。 巨大 取引。通常のALTER TABLE
よりもさらに多くの負荷が発生します 。
さらに、その時点でアプリケーションをシャットダウンして、書き込みが行われないようにする必要があります(INSERT
、DELETE
、UPDATE
)あなたのテーブルに。もしそうなら、あなたのトランザクション全体は無意味です。
オンラインツールが提供するもの
すべてのツールが同じように機能するわけではありません。ただし、基本は共有されています:
- スキーマが変更された「シャドウ」テーブルを作成します
- トリガーを作成して使用し、元のテーブルからゴーストテーブルに変更を伝播します
- ゆっくりと テーブルからシャドウテーブルにすべての行をコピーします。それらはチャンクでそうします:例えば、一度に1,000行。
- 元のテーブルにアクセスして操作できる間に、上記のすべてを実行します。
- 満足したら、
RENAME
を使用して2つを交換します 。
openark-kit ツールは3。5年間使用されています。 Perconaツールは数か月前のものですが、前者よりもテストされている可能性があります。 FacebookのツールはFacebookでうまく機能すると言われていますが、平均的なユーザーに一般的なソリューションを提供していません。自分では使ったことがありません。
2016年の編集: gh-ost
はトリガーレスソリューションであり、マスターのマスター書き込み負荷を大幅に削減し、移行書き込み負荷を通常の負荷から切り離します。それは監査可能、制御可能、テスト可能です。 GitHubで社内で開発し、オープンソースとしてリリースしました。 gh-ost
を介してすべての本番環境の移行を行っています 今日。詳細については、こちら
をご覧ください。 。
各ツールには独自の制限があります。ドキュメントをよく見てください。
保守的な方法
保守的な方法は、アクティブ-パッシブマスター-マスターレプリケーションを使用し、ALTER
を実行することです。 スタンバイ(パッシブ)サーバーで、役割を切り替えてALTER
を実行します 以前はアクティブサーバーでしたが、現在はパッシブになっています。これも良いオプションですが、追加のサーバーとレプリケーションに関するより深い知識が必要です。