現在、インデックスを追加するために、テーブル(20Mエントリ)でalterクエリを実行しています。すでに3日以上実行されています(「tmpテーブルへのコピー」でスタックします)。
クエリの進行状況を確認する方法はありますか、言い換えると、完了の推定時間を取得する方法はありますか?
ありがとう。
SHOW CREATE TABLE tblname\G
テーブルの上に、私達にあなたがしたいのインデックスを教えてください。
現在、インデックスを追加するために、テーブル(20Mエントリ)でalterクエリを実行しています。すでに3日以上実行されています(「tmpテーブルへのコピー」でスタックします)。
クエリの進行状況を確認する方法はありますか、言い換えると、完了の推定時間を取得する方法はありますか?
ありがとう。
SHOW CREATE TABLE tblname\G
テーブルの上に、私達にあなたがしたいのインデックスを教えてください。
回答:
mysqlがテーブルを変更する場合、基本的にテーブルのコピーを作成してからコピーをスワップインします。この方法で更新を途中でキャンセルしても、テーブルは安定した状態のままです。したがって、mysqlデータディレクトリ(/ var / lib / mysql /?)を調べて、新しいファイルの大きさを確認できます。これはInnodbではもう少し難しいですが、どこかに作成されたtmpテーブルがあります。
ソートバッファー変数(myisam_sort_buffer_size、sort_buffer_size)を増やすことで、インデックスにかかる時間を大幅に短縮できます。あなたが持っているメモリでできる限り大きくします。変更時間を数日短縮することも、メモリの量に応じて数時間に短縮することもできます。約3時間で1億5000万件のレコードテーブルを作成しました。
innodb_fle_per_tableはOFFであるため、テーブルを表示して進行状況を測定することはできません。
MyISAMでこれを行う方法について、以前に投稿しました。InnoDB_file_per_tableが有効になっていて、InnoDBインフラストラクチャを再設計する場合にのみ、InnoDBに対してこれを行うことができます。問題のファイルのサイズをオペレーティングシステムで調べる必要があります。
InnoDBクリーンアップを完全に実装し、innodb_file_per_tableを有効にしたら、次のようにインデックスの更新を実行できます。
例は次のとおりです
db.lotsofdata
2,000万の名前で呼び出されたInnoDBテーブル:テーブルは次のようになります。
CREATE TABLE db.lotsofdata
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30),
PRIMARY KEY (id)
) ENGINE=InnoDB;
名前インデックスを作成するとします。あなたはこれを行うことができます:
CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;
INSERTの実行中に、オペレーティングシステムに移動してこれを実行します。
cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd
これにより、現在のサイズのリストが表示されlotsofdata_new.ibd
ます。がを超えるとlotsofdata.ibd
、完了に近づいていることがわかります。
インデックス作成の進行状況を確認する信頼できる方法はありません。innodb-file-per-tableがオンになっている場合、データディレクトリに作成されている一時的な.ibdファイルを調べて現在のファイルのサイズと比較することで、何らかの兆候を得ることができますが、それはそれほどではありません削除/断片化により現在のデータファイルが肥大化する可能性があり、新しいデータファイルには以前のインデックスではなかった追加のインデックスが含まれるため、信頼性が高くなります。
InnoDBプラグインがインストールされていないバージョンのMySQLを使用しているようです。InnoDBプラグインには、インデックスの追加と削除のためにテーブルを完全に再構築する必要のない高速インデックス作成機能があります。InnoDBプラグインはMySQL 5.5でデフォルトで有効になっており、5.1.38以降の構成設定で使用できます。
Percona Serverはかなり以前のバージョン(5.5以前)でInnoDBプラグインをデフォルトで有効にしています。
Perconaによるpt-online-schema-changeは、残り時間の見積もりを示しています。デフォルトでは、30秒ごとに残り時間の推定値と進行状況の割合が出力されます。
また、ALTERコマンドを単独で実行する場合と比較して、追加の機能もあります。
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html