web-dev-qa-db-ja.com

MySQL InnoDB-innodb_file_per_table短所?

デフォルトでは、MySQL InnoDBはすべてのDBのすべてのテーブルを1つのグローバルファイルに格納します。これを変更するには、configでinnodb_file_per_tableを設定します。これにより、テーブルごとに1つのデータファイルが作成されます。

なぜinnodb_file_per_tableはデフォルトでは有効になっていません。それを使用することの欠点はありますか?

32
UpTheCreek

これに対する完全な答えがあります。

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種類の情報が格納されています

  • テーブルデータ
  • テーブルインデックス
  • MVCC(Multiversioning Concurrency Control) Data
    • ロールバックセグメント
    • スペースを元に戻す
  • テーブルメタデータ(データディクショナリ)
  • 二重書き込みバッファー(OSキャッシュへの依存を防ぐためのバックグラウンド書き込み)
  • バッファーの挿入(一意でないセカンダリインデックスへの変更の管理)
  • _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%であることを確認してください。

  • ステップ05)ibdata1、ib_logfile0およびib_logfile1を削除します(削除する前に以下の更新を参照してください!

この時点では、/ var/lib/mysqlにmysqlスキーマのみがあるはずです。

  • ステップ06)mysqlを再起動します

これにより、ibdata1が10MB(オプションを構成しないでください)、ib_logfile0およびib_logfile1がそれぞれ1Gで再作成されます。

  • ステップ07)SQLData.sqlをmysqlに再ロードします

_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に縮小しました。

試してみる。これについてさらに質問がある場合は、私にメールしてください。私を信じて。これは短期的にも長期的にも機能します。

UPDATE 2013-07-02 15:08 EDT

私が他の投稿で更新したという点で私は警告を持っていますが、私はこれを逃しました:以前は innodb_fast_shutdown で私の答えをもう少し更新していますこれを行うには、mysqlを再起動し、mysqlを停止します。現在、コミットされていないすべてのトランザクションにはInnoDBトランザクションログの内部および外部に他の可動部分がある可能性があるため、この1ステップは非常に重要です( InnoDBインフラストラクチャを参照 )。

innodb_fast_shutdown を2に設定すると、ログもクリーンアップされますが、mysqldの起動時にさらに多くの可動部分が存在し、クラッシュリカバリで選択されることに注意してください。 0の設定が最適です。

32
RolandoMySQLDBA

バグ を参照してください。

それを使用することの欠点はありますか?

  • その他の開いているファイル
  • オーバーヘッドを開く/再開する
  • .ibdファイルが縮小されない( 12 を参照)

大規模なデータベースでは常にinnodb_file_per_tableを使用します。

12
alvosu

mariaDBでは、innodb_file_per_tableがデフォルトで有効になっています。

8
Alex

もう少し情報を追加するだけです

Mysql 5.6.6以降、デフォルトで有効になっています

3
PerroVerd

innodb_file_per_tableを使用しないことを選択した理由は、各テーブルが独自のファイルに配置されるためです。つまり、各テーブルは独自の個別のオーバーヘッド(ファイルシグネチャなど)を取得し、全体のサイズ全体を引き起こします。 MySQLディレクトリのサイズは、共有テーブルスペースを使用する場合よりも大きくなります。さらに、単一の大きなファイルではなく、複数の小さなファイルを使用すると、クラスターのたるみのために無駄なスペースが増えます。

確かに、追加のオーバーヘッドは、特に大規模なドライブを使用している場合や巨大なデータベースを使用している場合、グランドスキームの大きな量ではありませんが、私自身(そしておそらく多くの「ホームユーザー」)にとっては、それらはすべて合算され、MySQLストアを保持している大きなクラスターを持つ小さなドライブにはまだ多すぎました。

たとえば、my WordPressデータベースと他のいくつかの小さなデータベース(phpBB、dev、いくつかのAMPテストなど)を含むデータベースストアで、テーブルごとに変換すると、32MBから50MBに変更されました。そして、それはibdata1さえも含んでおらず、これは最低10MBを必要とするため、合計少なくとも60MB。

私が言ったように、これは一部の人々、特に企業にとってそれほど問題ではないかもしれませんが、あなたがあなたのサイト、ブログなどをホストしているだけのホームユーザーであるなら、それは確かに選択のようなものの要因になる可能性があります多くのホストが合計ディスク使用量に加えてデータベースのサイズを制限するため、ホストプロバイダー。

2
Synetech

innodb_file_per_table = 1を使用すると、テーブルのドロップが遅くなる可能性があります ここ

1
Alex Zheng