デフォルトでは、MySQL InnoDBはすべてのDBのすべてのテーブルを1つのグローバルファイルに保存します。これを変更するには、configでinnodb_file_per_tableを設定します。これにより、テーブルごとに1つのデータファイルが作成されます。
なぜinnodb_file_per_table
デフォルトで有効になっていないのだろうか。それを使用することの欠点はありますか?
デフォルトでは、MySQL InnoDBはすべてのDBのすべてのテーブルを1つのグローバルファイルに保存します。これを変更するには、configでinnodb_file_per_tableを設定します。これにより、テーブルごとに1つのデータファイルが作成されます。
なぜinnodb_file_per_table
デフォルトで有効になっていないのだろうか。それを使用することの欠点はありますか?
回答:
これに対する完全な答えがあります。
いったんもしinnodb_file_per_tableは場所に置かれ、そして新しいInnoDBテーブルを使用して縮小することができますALTER TABLE <innodb-table-name> ENGINE=InnoDB';
。これは、新しい縮小する.ibd
保証のファイルを。
ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
innodb_file_per_tableを使用する前に作成されたInnoDBテーブルで実行すると、そのテーブルのデータとインデックスがibdata1ファイルからヤンクされ、ファイルに保存され.ibd
ます。 。
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スキーマのみが存在するはずです。
これにより、10MBでibdata1が再作成され(オプションを構成しない)、それぞれ1Gでib_logfile0およびib_logfile1が作成されます。
ibdata1
成長しますが、テーブルメタデータと断続的なMVCCデータのみが含まれます。
各InnoDBテーブルは外部に存在します ibdata1
mydb.mytableという名前のInnoDBテーブルがあるとします。に入る/var/lib/mysql/mydb
と、テーブルを表す2つのファイルが表示されます。
mytable.frm
(ストレージエンジンヘッダー)mytable.ibd
(のテーブルデータとテーブルインデックスのホームmydb.mytable
)ibdata1
InnoDBデータとインデックスが含まれなくなります。
ではもしinnodb_file_per_tableオプションで/etc/my.cnf
、あなたは実行することができOPTIMIZE TABLE mydb.mytable
OR ALTER TABLE mydb.mytable ENGINE=InnoDB;
、ファイルが/var/lib/mysql/mydb/mytable.ibd
実際に縮小します。
私はこれまでMySQL DBAとしてのキャリアでこれまで何度もこれを行いました。実際、これを初めて行ったとき、50GBのibdata1ファイルを50MBに縮小しました。
試してみる。これについてさらに質問がある場合は、私にメールしてください。私を信じて。これは短期的にも長期的にも機能します。
この点に関して、他の投稿で更新したという警告がありますが、これを見逃しました:mysqlを再起動してmysqlを停止していたため、innodb_fast_shutdownで回答をもう少し更新しています。現在、コミットされていないすべてのトランザクションには、InnoDBトランザクションログの内部および外部に他の可動部分がある可能性があるため、この1ステップが不可欠です(InnoDBインフラストラクチャを参照)。
innodb_fast_shutdownを2に設定するとログも消去されますが、さらに多くの可動部分が存在し、mysqldの起動中にクラッシュリカバリで選択されることに注意してください。0の設定が最適です。
innodb_fast_shutdown=0
ログファイルを削除するためにシャットダウンする前に、MySQLでオプションを設定する必要があります!(ib_logfile0
およびib_logfile1
)そうしないと、データを失う可能性があります!
ibdata1
、ファイルごとの代替ファイルではありません。少なくともを使用して.ibdを縮小することは可能optimize table
ですが、これはibdata1を縮小するのに比べれば簡単です。
MariaDBでは、innodb_file_per_tableがデフォルトで有効になっています。
を使用しないことを選択した理由innodb_file_per_table
は、各テーブルが独自のファイルに配置されるためです。つまり、各テーブルが独自の個別のオーバーヘッド(ファイル署名など)を取得し、MySQL
ディレクトリ全体の合計サイズが共有テーブルスペースを使用する場合よりも大きくなります。さらに、単一の大きなファイルではなく、複数の小さなファイルがある場合、クラスターのスラックにより無駄なスペースが増えます。
確かに、追加のオーバーヘッドは、特に大きなドライブを使用している場合や巨大なデータベースを持っている場合、物事の大規模なスキームでは大した量ではありませんが、私(およびおそらく多くの「ホームユーザー」) MySQLストアを保持している大規模なクラスターを備えた小さなドライブには、まだ多すぎます。
たとえば、WordPressデータベースと他のいくつかの小さなデータベース(phpBB、dev、一部のAMPテストなど)を含むデータベースストアは、テーブルごとに変換して32MBから50MBに変更しましibdata1
たが、必要と10メガバイトの最小値を合計するため、少なくとも 60メガバイト
私が言ったように、これは一部の人々、特に企業にとってはそれほど大きな問題ではないかもしれませんが、あなたがあなたのサイト、ブログなどをホストしているだけのホームユーザーであれば、それは実際に選択のようなものの要因になります多くのホストが合計ディスク使用量に加えてデータベースのサイズを制限するため、ホストプロバイダー。
IBDATA1
)。30MBから〜85MBになりました。全部を削除し、ゼロからダンプをインポートすることで、以前の30MBの代わりに69MBになりました(データベースの半分以上を占めると推測されますone)。何らかの理由で、テーブルごとに使用しているにもかかわらず、私ibdata1
はまだ18MBです。☹
innodb_file_per_table = 1を使用すると、ドロップテーブルが遅くなることがあります。こちらをご覧ください