MySQL 5.1.4x(Windows)| Innodb
私は最近、mySQL DB(数十万行)からデータをパージし、使用する予定です
OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;
データスペースのフットプリントを減らすために、空の空白がファイルシステムで使用されています。
私の懸念は、このコマンドを開始すると、どれくらいの時間がかかるのか、プロセスのどこにあるのかわからなくなることです。とにかくこの情報を特定できますか?私の知る限り、進行状況の指標はありません。
MySQLには、OPTIMIZE TABLE;
の進行状況を示すものはありません。
Windowsエクスプローラーを使用してOSにアクセスし、増大するtmpテーブルを探す必要がある場合があります。ヒント:一時テーブルは、#sql-9999.MYD
および#sql-9999.MYI
という名前の.frm
ファイルを持たないMyISAMテーブルです。これら2つのファイルは存在しますが、クエリは進行中と見なされます。どれだけの行があるかを知るには、行の数に平均行の長さを掛けた数を調べて、実行された割合または実行されなかった割合を推定する必要があります。
ALTER TABLE
ADD INDEX
DROP INDEX
LOAD DATA INFILE
CHECK TABLE
REPAIR TABLE
ANALYZE TABLE
OPTIMIZE TABLE
MySQLの操作の観点から以前に主題について説明しました
May 02, 2012
: 大きな.sqlファイルのインポートの進行状況を監視するにはどうすればよいですか?Jan 17, 2012
: インデックスの追加が非常に遅い... ETAを取得するか、進行状況を表示するためのmysqlコマンドはありますか?InnoDBのibdata1のサイズを削減しようとしている場合、テーブルを削除してもibdata1に大きなギャップが残るだけです。 InnoDBインフラストラクチャの完全なクリーンアップを実行する必要があります。
Apr 01, 2012
: innodb_file_per_tableは推奨ですか?Mar 25, 2012
: なぜInnoDBはすべてのデータベースを1つのファイルに格納するのですか?Mar 29, 2011
: Windowsで実行されているMySQLデータベースサーバーの最大テーブルサイズ(NTFS)テーブルタイプInnoDBFeb 04, 2011
: MySQL InnoDB-innodb_file_per_table cons?Oct 29, 2010
: 方法:mysql InnoDBストレージエンジンをクリーンアップしますか?このデータベースはinnodbを使用しているので、検索できる一時テーブルが増えていきますか?
あなたが走りたいとしましょう
OPTIMIZE TABLE mydb.mytable;
innodb_file_per_table およびこれを含む2つのシナリオを見てくださいOPTIMIZE TABLE
OPTIMIZE TABLE
を実行すると、mydb.mytable
のすべてのデータページとインデックスページがibdata1に連続して追加されます。これは、断片化の狂気にさらに追加するために以前占有されていたスペースを残します。
このシナリオでは、一時テーブルはInnoDBとして存在し、ibdata1で実体化します。したがって、視覚的に監視するものは何もありません。
InnoDBテーブルmydb.mytableごとに、
.ibd
ファイルには、テーブルのデータページとインデックスページが含まれています。
OPTIMIZE TABLE
を実行すると、mydb.mytable
のすべてのデータとインデックスページが、Windowsエクスプローラーで確認できる外部.ibd
ファイルに書き込まれます。
innodb_file_per_table を有効にしてOPTIMIZE TABLE
を実行すると、以前にibdata1内で占有されていたスペースが再利用されることはありません。 InnoDB Cleanup を実行して、データとインデックスが決してibdata1に存在しないようにibdata1を再作成する必要があります。
前述のように、MariaDBはOPTIMIZE TABLE;
を監視できます
監視できるものが必要で、 innodb_file_per_table が有効になっている場合は、
OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;
次の機械的同等物を使用して:
CREATE TABLE LOGTABLEFOO1_NEW LIKE LOGTABLEFOO1;
INSERT INTO LOGTABLEFOO1_NEW SELECT * FROM LOGTABLEFOO1;
ALTER TABLE LOGTABLEFOO1 RENAME LOGTABLEFOO1_OLD;
ALTER TABLE LOGTABLEFOO1_NEW RENAME LOGTABLEFOO1;
DROP TABLE LOGTABLEFOO1_OLD;
ANALYZE TABLE LOGTABLEFOO1;
CREATE TABLE LOGTABLEFOO2_NEW LIKE LOGTABLEFOO2;
INSERT INTO LOGTABLEFOO2_NEW SELECT * FROM LOGTABLEFOO2;
ALTER TABLE LOGTABLEFOO2 RENAME LOGTABLEFOO2_OLD;
ALTER TABLE LOGTABLEFOO2_NEW RENAME LOGTABLEFOO2;
DROP TABLE LOGTABLEFOO2_OLD;
ANALYZE TABLE LOGTABLEFOO2;
CREATE TABLE LOGTABLEFOO3_NEW LIKE LOGTABLEFOO3;
INSERT INTO LOGTABLEFOO3_NEW SELECT * FROM LOGTABLEFOO3;
ALTER TABLE LOGTABLEFOO3 RENAME LOGTABLEFOO3_OLD;
ALTER TABLE LOGTABLEFOO3_NEW RENAME LOGTABLEFOO3;
DROP TABLE LOGTABLEFOO3_OLD;
ANALYZE TABLE LOGTABLEFOO3;
OPTIMIZE TABLE はALTER TABLE ... ENGINE=InnoDB;
の後に ANALYZE TABLE が続くことを覚えておいてください。
これらの手順で、一時テーブルが何であるかを事前に知ることができます
LOGTABLEFOO1_NEW.ibd
LOGTABLEFOO2_NEW.ibd
LOGTABLEFOO3_NEW.ibd
各ファイルの存在とサイズが消えるまで監視するだけです。
ファイルシステムにアクセスできる場合は、もっと簡単な方法があります。
MySQLは.TMDファイルを生成します。ファイルのサイズが大きくなるのを見ることができます。それが完了すると、多かれ少なかれ既存のMYDのサイズに達するはずです。
たとえば、datadirにcdし、単にwatch "ls -lah|grep table_name"
は、このようなものを返します(Linuxの場合)。私の場合、進行状況は427 MBから287 MBです(大体)。
-rw-rw----. 1 mysql mysql 427M Feb 19 23:45 ticket_change.MYD
-rw-rw----. 1 mysql mysql 541M Feb 20 01:10 ticket_change.MYI
-rw-rw----. 1 mysql mysql 287M Feb 20 01:45 ticket_change.TMD
Percona Toolkitの pt-online-schema-change がこれを行います。
変化する mydb.LOGTABLEFOO1
からInnoDB
まで、効果的にOPTIMIZE TABLE
それはすでにInnoDBテーブルなので、非ブロッキング方式で
pt-online-schema-change --alter "ENGINE=InnoDB" D=mydb,t=LOGTABLEFOO1