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.ini
Windowsの場合)[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_DIRECT
Windowsでは使用できません) -
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%のルールを使用します。次に、本番環境で時間の経過とともにワークロードをより正確に決定できるため、サイズを変更できますログ わずか数分でメンテナンスサイクル中に。