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