InnoDBに関するより完全な答えは次のとおりです。これは少し時間のかかるプロセスですが、努力する価値があります。
/ var / lib / mysql / ibdata1に注意してください InnoDBインフラストラクチャで最もビジーなファイルです。通常、6種類の情報が格納されています:
- テーブルデータ
- テーブルインデックス
- MVCC(Multiversioning Concurrency Control)
データ
- ロールバックセグメント
- スペースを元に戻す
- テーブルメタデータ(データディクショナリ)
- ダブル書き込みバッファ(OSキャッシングへの依存を防ぐためのバックグラウンド書き込み)
- バッファの挿入(一意でないセカンダリインデックスへの変更の管理)
-
画像表現を参照してくださいibdata1の
InnoDBアーキテクチャ
多くの人が複数のibdataを作成します より良いディスクスペース管理とパフォーマンスを望んでいるファイルですが、その信念は間違っています。
OPTIMIZEを実行できますか表
?
残念ながら、 OPTIMIZE TABLE コード>
共有テーブルスペースファイルibdata1に格納されているInnoDBテーブルに対して 2つのことを行います:
- テーブルのデータとインデックスを
ibdata1内で連続させます -
ibdata1を作成します 隣接するデータとインデックスページが追加されるため、成長しますibdata1へ
ただし、テーブルデータとテーブルインデックスを ibdata1から分離することはできます。 独立して管理します。
OPTIMIZEを実行できますか表
innodb_file_per_table >
?
innodb_file_per_table<を追加するとします。 / code>
/etc/my.cnf(my.ini)へ 。次に、 OPTIMIZETABLEを実行できますか
すべてのInnoDBテーブルで?
朗報 : OPTIMIZETABLE<を実行する場合/ code>
innodb_file_per_table >
有効にすると、 .ibdが生成されます そのテーブルのファイル。たとえば、テーブル mydb.mytableがある場合 / var / lib / mysqlのdatadirを使用 、次のように生成されます:
-
/var/lib/mysql/mydb/mytable.frm -
/var/lib/mysql/mydb/mytable.ibd
.ibd そのテーブルのデータページとインデックスページが含まれます。すばらしい。
悪いニュース : mydb.mytableのデータページとインデックスページを抽出するだけです。 ibdataに住んでいることから 。 mydb.mytableを含むすべてのテーブルのデータディクショナリエントリ 、まだデータディクショナリに残っています(の画像表現を参照してください) ibdata1
)。 ibdata1を簡単に削除することはできません この時点で!!! ibdata1に注意してください まったく縮小していません。
InnoDBインフラストラクチャのクリーンアップ
ibdata1を縮小するには 一度限り、次のことを行う必要があります:
-
ダンプ(例:
mysqldump)すべてのデータベースを.sqlに テキストファイル(SQLData.sql以下で使用されます) -
すべてのデータベースを削除します(
mysqlを除く) およびinformation_schema)警告 :予防策として、このスクリプトを実行して、すべてのユーザー許可が設定されていることを確認してください:mkdir /var/lib/mysql_grants cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/. chown -R mysql:mysql /var/lib/mysql_grants -
mysqlにログインし、
SET GLOBAL innodb_fast_shutdown =0;を実行します。 (これにより、残りのすべてのトランザクション変更がib_logfile0から完全にフラッシュされます。 およびib_logfile1) -
MySQLをシャットダウン
-
次の行を
/etc/my.cnfに追加します (またはmy.iniWindowsの場合)[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%です 。また:
innodb_flush_method =O_DIRECTWindowsでは使用できません) -
ibdata *を削除します およびib_logfile*、オプションで、/ var / lib / mysql内のすべてのフォルダを削除できます 、/ var / lib / mysql / mysqlを除く 。 -
MySQLを起動します(これにより、
ibdata1が再作成されます [デフォルトで10MB]およびib_logfile0およびib_logfile1各1Gで)。 -
SQLData.sqlをインポートします
さて、 ibdata1 各InnoDBテーブルはibdata1の外部に存在するため、引き続き拡張されますが、テーブルメタデータのみが含まれます。 。 ibdata1 InnoDBデータと他のテーブルのインデックスは含まれなくなります。
たとえば、 mydb.mytableという名前のInnoDBテーブルがあるとします。 。 / var / lib / mysql / mydbを見ると 、テーブルを表す2つのファイルが表示されます:
-
mytable.frm(ストレージエンジンヘッダー) -
mytable.ibd(テーブルデータとインデックス)
innodb_file_per_tableを使用 /etc/my.cnfのオプション 、 OPTIMIZE TABLE mydb.mytableを実行できます およびファイル/var/lib/mysql/mydb/mytable.ibd 実際に縮小します。
私はMySQLDBAとしてのキャリアの中でこれを何度も行ってきました。実際、これを初めて行ったときは、 50GBを縮小しました。 ibdata1 わずか500MBまでファイルを作成してください!
試してみる。これについてさらに質問がある場合は、質問してください。私を信じて;これは、短期的にも長期的にも機能します。
警告
ステップ6で、 mysqlが原因でmysqlを再起動できない場合 スキーマの削除を開始します。手順2を振り返ります。mysqlの物理コピーを作成しました スキーマ。次のように復元できます:
mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql
手順6に戻り、続行します
UPDATE 2013-06-04 11:13 EDT
innodb_log_file_size の設定に関して innodb_buffer_pool_size の25%まで ステップ5では、それは包括的なルールです。
2006年7月3日に戻る 、Perconaには素晴らしい記事がありました適切なinnodb_log_file_sizeを選択する理由 。その後、2008年11月21日 、Perconaは、1時間分の変更を維持しながらピークワークロードに基づいて適切なサイズを計算する方法
。
それ以来、ログサイズの計算と、これら2つのPerconaの記事を参照した場所について、DBAStackExchangeに投稿しました。
2012年8月27日:48GBRAMを搭載したサーバーでの30GBInnoDBテーブルの適切な調整2013年1月17日: MySQL 5.5 --Innodb --innodb_log_file_sizeの合計が4GBを超えていますか?
個人的には、初期設定には25%のルールを使用します。次に、本番環境で時間の経過とともにワークロードをより正確に決定できるため、サイズを変更できますログ わずか数分でメンテナンスサイクル中に。