適切なインデックスを追加することで、本番環境で実行されている大規模なMySQLデータベースでのクエリのパフォーマンスを改善したいと考えています。ライブデータベースにインデックスを追加しようとしましたが、もちろんこれによりデータベースがロックされ、アプリケーションが使用できなくなります。
更新されたインデックスを使用してセカンダリデータベースを作成し、データベースデータを移行することを考えました。これにはある程度のダウンタイムが伴います。
これを行うにはもっと良い方法がありますか?ダウンタイムはありませんか?
よろしくお願いします
ライブテーブルにインデックスを追加する場合、2つの主要なアプローチがあります。
このツールは素晴らしいです。それはあなたのために一時テーブルを作成し、それを投入します。
簡単に言えば、mydb.mytableに対してこれを行います。
CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
INSERT INTO mydb.mytable_new SELECT * FROM mydb.mytable;
RENAME mydb.mytable TO mydb.mytable_old,mydb.mytable_new TO mydb.mytable;
DROP TABLE mydb.mytable_old;
ただし、 pt-online-schema-change はこれをはるかに超えています。
一時テーブルにすでにコピーされている行が更新または削除された場合はどうなりますか? pt-online-schema-change は、ソーステーブルにトリガーを追加して、INSERT後の変更を処理します。一時テーブルへのコピーが完了すると、トリガーは切り替えの直前に削除されます。
スロットルするオプション( -max-load および -critical-load など)または停止(たとえば -pause-file )ライブシステムの負荷が高い場合、またはサーバーに一定の秒数( -max-lag )。
構文のみをテストするオプション( -dry-run )または実際に変更を実行するオプションもあります( -execute ) 。
Sql_log_binなどの変数を0に設定し、外部キー制約をチェックするオプションがあります。
このツールの制限は?
MySQLは、ネイティブSQLを使用してオンラインでDDLを実行することもできます。
私の古い投稿を見る
Aug 01, 2017
: 大きなテーブルをダウンタイムなしで変更Feb 12, 2015
: 整合性を維持しながらMySQLスキーマを進化させる方法残念ながら、オンラインDDLには、操作を調整または停止するオプションがありません。
最近は pt-online-schema-change を使用しています。これは、プロセスの速度を制御できるためです。一日中停止して再開することもできます。あるとき、私は他の2人のDBAと一緒に、読み取りと書き込みが非常に高い30GBで pt-online-schema-change を実行しました。私たちが協力した開発チームは、日中は一時テーブルへのコピーを一時停止し、夜間にコピーを再開するように求めました。これを3日間で行いました。すべてが成功し、アプリケーションは影響を受けませんでした。