デフォルトでは、MySQL InnoDBはすべてのDBのすべてのテーブルを1つのグローバルファイルに格納します。これを変更するには、configでinnodb_file_per_tableを設定します。これにより、テーブルごとに1つのデータファイルが作成されます。
なぜinnodb_file_per_table
はデフォルトでは有効になっていません。それを使用することの欠点はありますか?
これに対する完全な答えがあります。
innodb_file_per_table を配置したら、_ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
_を使用して新しいInnoDBテーブルを縮小できます。これにより、新しい_.ibd
_ファイルが保証されます。
Innodb_file_per_tableを使用する前に作成されたInnoDBテーブルで_ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
_を実行すると、そのテーブルのデータとインデックスがibdata1ファイルから削除され、_.ibd
_ファイルに保存されます。これにより、永続的なibdata1内の鳩全体。再利用できません。
_ibdata1
_ファイルには通常、4種類の情報が格納されています
Pictorial Representation of ibdata1
_ を参照してくださいこれは、ibdata1ファイルをほぼ永久に縮小するための保証された方法です...
ステップ01)MySQLDumpですべてのデータベースをSQLテキストファイル(SQLData.sqlと呼びます)
ステップ02)すべてのデータベース(mysql、information_schemaおよびperformance_schemaスキーマを除く)を削除します
ステップ03)mysqlをシャットダウンする
ステップ04)/etc/my.cnfに次の行を追加します
_[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
_
補足:innodb_buffer_pool_sizeの設定が何であれ、innodb_log_file_sizeがinnodb_buffer_pool_sizeの25%であることを確認してください。
この時点では、/ var/lib/mysqlにmysqlスキーマのみがあるはずです。
これにより、ibdata1が10MB(オプションを構成しないでください)、ib_logfile0およびib_logfile1がそれぞれ1Gで再作成されます。
_ibdata1
_は大きくなりますが、テーブルメタデータと断続的なMVCCデータのみが含まれます。
各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
_ OR _ALTER TABLE mydb.mytable ENGINE=InnoDB;
_およびファイル_/var/lib/mysql/mydb/mytable.ibd
_は実際には縮小されます。
私は、MySQL DBAとしての私のキャリアの中で、これまで何度も問題を抱えることなく何度もこれを行ってきました。実際、初めてこれを行ったとき、50GBのibdata1ファイルを50MBに縮小しました。
試してみる。これについてさらに質問がある場合は、私にメールしてください。私を信じて。これは短期的にも長期的にも機能します。
私が他の投稿で更新したという点で私は警告を持っていますが、私はこれを逃しました:以前は innodb_fast_shutdown で私の答えをもう少し更新していますこれを行うには、mysqlを再起動し、mysqlを停止します。現在、コミットされていないすべてのトランザクションにはInnoDBトランザクションログの内部および外部に他の可動部分がある可能性があるため、この1ステップは非常に重要です( InnoDBインフラストラクチャを参照 )。
innodb_fast_shutdown を2に設定すると、ログもクリーンアップされますが、mysqldの起動時にさらに多くの可動部分が存在し、クラッシュリカバリで選択されることに注意してください。 0の設定が最適です。
mariaDBでは、innodb_file_per_tableがデフォルトで有効になっています。
もう少し情報を追加するだけです
Mysql 5.6.6以降、デフォルトで有効になっています
innodb_file_per_table
を使用しないことを選択した理由は、各テーブルが独自のファイルに配置されるためです。つまり、各テーブルは独自の個別のオーバーヘッド(ファイルシグネチャなど)を取得し、全体のサイズ全体を引き起こします。 MySQL
ディレクトリのサイズは、共有テーブルスペースを使用する場合よりも大きくなります。さらに、単一の大きなファイルではなく、複数の小さなファイルを使用すると、クラスターのたるみのために無駄なスペースが増えます。
確かに、追加のオーバーヘッドは、特に大規模なドライブを使用している場合や巨大なデータベースを使用している場合、グランドスキームの大きな量ではありませんが、私自身(そしておそらく多くの「ホームユーザー」)にとっては、それらはすべて合算され、MySQLストアを保持している大きなクラスターを持つ小さなドライブにはまだ多すぎました。
たとえば、my WordPressデータベースと他のいくつかの小さなデータベース(phpBB、dev、いくつかのAMPテストなど)を含むデータベースストアで、テーブルごとに変換すると、32MBから50MBに変更されました。そして、それはibdata1
さえも含んでおらず、これはが最低10MBを必要とするため、合計少なくとも60MB。
私が言ったように、これは一部の人々、特に企業にとってそれほど問題ではないかもしれませんが、あなたがあなたのサイト、ブログなどをホストしているだけのホームユーザーであるなら、それは確かに選択のようなものの要因になる可能性があります多くのホストが合計ディスク使用量に加えてデータベースのサイズを制限するため、ホストプロバイダー。
innodb_file_per_table = 1を使用すると、テーブルのドロップが遅くなる可能性があります ここ