これについては、2010年10月にStackOverflowで取り上げました。
InnoDBインフラストラクチャで最も忙しいファイル:/ var / lib / mysql / ibdata1に注意してください
このファイルには通常、4種類の情報が含まれています
- テーブルデータ
- テーブルインデックス
- MVCC(マルチバージョン同時実行制御)データ
- テーブルメタデータ(テーブルスペースIDのリスト)
OPTIMIZE TABLE
ibdata1に保存されているInnoDBテーブルに対して実行すると、次の2つのことが行われます。
- テーブルのデータとインデックスをibdata1内で連続させ、アクセスを高速化します
- 連続したデータおよびインデックスページがibdata1に追加されるため、ibdata1が成長します。
テーブルデータとテーブルインデックスをibdata1から分離し、innodb_file_per_tableを使用して個別に管理することができますが、ibdata1のディスクスペースの大きなギャップ全体は単純に消えず、回収できません。あなたはもっとしなければなりません。
するために、一度、すべてのibdata1とをシュリンクあなたは、次の操作を行う必要があります。
1)MySQLDumpすべてのデータベースをSQLテキストファイル(/root/SQLData.sqlと呼びます)
2)すべてのデータベースを削除します(mysqlスキーマを除く)
3)mysqlのシャットダウン
4)/etc/my.cnfに次の行を追加します
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
サイドノート:innodb_buffer_pool_sizeの設定にかかわらず、innodb_log_file_sizeがinnodb_buffer_pool_sizeの25%であることを確認してください。
5)ibdata1、ib_logfile0、およびib_logfile1を削除します
この時点では、/ var / lib / mysqlにのみmysqlスキーマが存在するはずです。
6)mysqlを再起動します
これにより、10MBまたは18MB(MySQLのバージョンに応じて)でibdata1、それぞれ1Gでib_logfile0およびib_logfile1が再作成されます
7)/root/SQLData.sqlをmysqlにリロードします
ibdata1は成長しますが、テーブルメタデータのみが含まれます。実際、それは何年もかけて非常にゆっくりと成長します。ibdata1を迅速に成長させる唯一の方法は、次の1つ以上がある場合です。
- DDLの多く(
CREATE TABLE
、DROP TABLE
、ALTER TABLE
)
- 多くのトランザクション
- トランザクションごとにコミットする多くの変更
各InnoDBテーブルはibdata1の外部に存在します
mydb.mytableという名前のInnoDBテーブルがあるとします。/ var / lib / mysql / mydbに移動すると、テーブルを表す2つのファイルが表示されます
- mytable.frm(ストレージエンジンヘッダー)
- mytable.ibd(mydb.mytableのテーブルデータとテーブルインデックスのホーム)
ibdata1にはInnoDBデータとインデックスが含まれなくなります。
/etc/my.cnfのinnodb_file_per_tableオプションを使用するOPTIMIZE TABLE mydb.mytable;
と、実行でき、ファイル/var/lib/mysql/mydb/mytable.ibdが実際に縮小します。
私はMySQL DBAとしてのキャリアの中でこれを何度もやりました
実際、初めてこれを行ったとき、50GBのibdata1ファイルを500MBに縮小しました。
試してみる。これについてさらに質問がある場合は、私にメールしてください。私を信じて。これは短期的にも長期的にも機能します!!!
更新2012-04-19 09:23 EDT
上記の手順を実行した後、どのテーブルを最適化する必要があるかをどのように判断できますか?見つけることは可能ですが、スクリプトを作成する必要があります。
例は次のとおりmydb.mytable
です。テーブルがあるとします。innodb_file_per_tableを有効にすると、ファイル/var/lib/mysql/mydb/mytable.ibdができます
2つの番号を取得する必要があります
OSからのファイルサイズ:このようにOSからファイルサイズを確認できます
ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print $5}'
INFORMATION_SCHEMAからのFILESIZE:次のようにinformation_schema.tablesからファイルサイズを確認できます。
SELECT (data_length+index_length) tblsize FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable';
OS値からINFORMATION_SCHEMA値を減算し、その差をINFORMATION_SCHEMA値で除算するだけです。
そこから、そのテーブルを最適化する必要があると考える割合を決定します。もちろん、次のコマンドのいずれかを使用してデフラグします。
OPTIMIZE TABLE mydb.mytable;
または
ALTER TABLE mydb.mytable ENGINE=InnoDB;