2010/09/13

MySQLでInnoDB

MySQL 5.1

[mysqld]
#innodb_data_home_dir =
#innodb_data_file_path = /db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
#
innodb_buffer_pool_size=512MB
innodb_additional_mem_pool_size=20M
#innodb_log_group_home_dir = /dr3/iblogs
#
#innodb_log_files_in_group = 2
#
innodb_log_file_size=128M
innodb_log_buffer_size=8M
#
#innodb_flush_log_at_trx_commit=1
#innodb_lock_wait_timeout=50

innodb_data_home_dir
全ての InnoDB データ ファイルのディレクトリ パスの主な部分。もしこの値を設定しなければ、デフォルトは MySQL データ ディレクトリになります。値を空の文字列として指定する事もでき、その場合は innodb_data_file_path 内で完全なファイル パスを利用する事ができます。

innodb_data_file_path
独立したデータ ファイルとそれらのサイズへのパス。各データ ファイルへの完全ディレクトリ パスは、ここに指定された各パスへの innodb_data_home_dir を結合する事によって形作られます。ファイル サイズは、サイズ値に M か G を付加して、MB か GB (1024MB)で指定されます。ファイル サイズの合計は最低10MB 必要です。もし innodb_data_file_path を指定しなければ、デフォルト動作で ibdata1 と名づけられた10MB の単一自動拡大データ ファイルが作成されます。各ファイルのサイズ制限は OS によって決定されます。大きいファイルをサポートする OS のサイズを4GB 以上に設定する事ができます。未加工ディスク パーティションをデータ ファイルとして利用する事もできます。詳しくは 項13.5.3.2. 「共有テーブルスペースに未加工デバイスを利用する」 を参照してください。

innodb_buffer_pool_size=8M
InnoDB がそのテーブルのデータとインデックスをキャッシュする為に利用する、メモリバッファ のバイトでのサイズです。この値を大きく設定するほど、テーブル内のデータにアクセスするのに必要なディスク I/O は少なくなります。専用のデータベース サーバ上で、これをマシンの物理的メモリ サイズの最大80% に設定すると良いでしょう。しかし、物理的メモリの競合が OS 内でページングを引き起こす可能性があるので、あまり大きく設定しないでください。

innodb_additional_mem_pool_size=1M
InnoDB がデータ辞書情報と別の内部データ構造を格納する為に利用する、メモリ プールのバイトでのサイズです。より多くのテーブルをアプリケーション内に持っていると、ここに割り当てる為により多くのメモリが必要になります。もし InnoDB がこのプール内のメモリを使い果たしてしまったら、これは OS からメモリを割り当て始め、MySQL エラー ログに警告メッセージを書きます。デフォルト値は1MB です。

innodb_log_group_home_dir
InnoDB ログ ファイルへのディレクトリ パス。もし InnoDB ログ変数を何も指定しなければ、デフォルトで MySQL データ ディレクトリ内に ib_logfile0 と ib_logfile1 という名前の2つの5MB ファイルを作成します。

innodb_log_files_in_group
ログ グループ内のログ ファイル数。InnoDB はファイルに輪状に書き込みをします。デフォルト(そして推奨)は2です。

innodb_log_buffer_size=1M
InnoDB がディスク上のログ ファイルに書き込む為に利用するバッファのバイトでのサイズ。実用的な値の範囲は1MB から8MB です。デフォルトは1MB です。大きいログ バッファは、トランザクション コミットの前にディスクにログを書き込む必要なく、大きいトランザクションが起動する事を許容します。従って、もし大きいトランザクションを持っていたら、ログ ファイルを大きくしておく事でディスク I/O を節約する事ができます。

innodb_log_file_size=5M
ログ グループ内のそれぞれの長いファイルのバイトでのサイズ。ログ ファイルの結合したサイズは32ビット コンピュータ上で 4GB 以下でなければいけません。デフォルトは5MB です。実用的な値は、N がグループ内のログ ファイル数だとして、バッファ プールのサイズの1MB から 1/N-th です。 値が大きいほど、ディスク I/O を節約し、バッファ プール内で必要とされるチェックポイント フラッシュ活動は少なくなります。しかし、ログ ファイルが大きいという事はクラッシュした時の復旧のスピードが遅いという事も意味します。

innodb_flush_log_at_trx_commit=1
innodb_flush_log_at_trx_commit が0に設定された時は、ログ バッファは1秒に一回ログ ファイルに書き込まれ、ディスク操作へのフラッシュはログ ファイル上で行われますが、トランザクション コミットの際には何も行われません。この値が1(デフォルト)の時は、ログ ファイルは各トランザクション コミットの時にログ ファイルに書き込まれ、ディスク操作へのフラッシュはログ ファイル上で行われます。2に設定された時は、ログ バッファはコミット毎にファイルに書き込まれますが、ディスク操作へのフラッシュはそこでは行われません。しかし、値が2の時もログ ファイル上でのフラッシュは1秒に1回行われます。1秒に1回のフラッシュは、処理スケジュールの発行の為100% 保証された物ではないという事に注意してください。

この変数のデフォルト値は1です。これは ACID 整合性に要求されている値です。より良い性能の為に1以外の値を設定する事もできますが、その場合1つのクラッシュの中で最大1秒分のトランザクションを失う可能性があります。もし値を0に設定すると、全ての mysqld プロセス クラッシュは最後の秒のトランザクションを消す場合があります。もし値を2に設定すると、OS のクラッシュか停電によって、最後の秒のトランザクションが消されてしまいます。 しかし、InnoDB のクラッシュ復旧は影響を受けないので、値に関係なくクラッシュ復旧は行われます。多くの OS といくつかのディスク ハードウェアはディスクへのフラッシュ操作を欺く事があると覚えておいてください。それらはフラッシュが行われていなくても、行われたと mysqld に伝える可能性があります。1の設定がしてあってもトランザクションの耐久力が保証されないという事になり、さらに悪い事に、停電によって InnoDB データベースが破損する可能性もあります。SCSI ディスク コントローラ内やディスク自体の中での、バッテリーに頼っているディスク キャッシュの利用はファイル フラッシュのスピートを上げ、操作を安全に行う事ができます。ハードウェア キャッシュ内でディスク書き込みのキャッシュを無効にする為に、Unix コマンド hdparm を利用してみたり、ハードウェア ベンダに対しての特定の別のコマンドを利用したりもできます。

注意:InnoDB とトランザクションを共に利用して複製設定内で最大の耐久力と一貫性を得る為に、お使いのマスタ サーバ my.cnf 内で innodb_flush_log_at_trx_commit=1 と sync_binlog=1 を利用しなければいけません。

innodb_lock_wait_timeout=50
InnoDB トランザクションがロール バックされる前に、ロックを待つ秒数でのタイムアウト。InnoDB は自動的にそれ自体のロック テーブル内でトランザクション デッドロックを検出し、トランザクションをロールバックします。InnoDB は LOCK TABLES ステートメントを利用してロック セットを通知します。デフォルトは50秒です。

警告: 32-bit GNU/Linux x86 上では、メモリ使用を高く設定しすぎないように注意してください。glibc はプロセス ヒープがスレッド スタックよりも大きくなる事を許容する可能性があり、その為サーバがクラッシュしてしまうかもしれません。もし次の式の値が2GB に近い、またはそれを上回っていたら危険です:

innodb_buffer_pool_size
+ key_buffer_size
+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)
+ max_connections*2MB
各スレッドはスタック(通常2MB ですが、MySQL AB バイナリ内ではたったの256KB)を利用し、そして最悪の場合、sort_buffer_size + read_buffer_size 追加メモリも利用します。
# mysql -uroot -p
mysql> show variables like "innodb%";
+-----------------------------------------+------------------------+
| Variable_name                           | Value                  |
+-----------------------------------------+------------------------+
| innodb_additional_mem_pool_size         | 1048576                | 
| innodb_autoextend_increment             | 8                      | 
| innodb_buffer_pool_awe_mem_mb           | 0                      | 
| innodb_buffer_pool_size                 | 8388608                | 
| innodb_checksums                        | ON                     | 
| innodb_commit_concurrency               | 0                      | 
| innodb_concurrency_tickets              | 500                    | 
| innodb_data_file_path                   | ibdata1:10M:autoextend | 
| innodb_data_home_dir                    |                        | 
| innodb_adaptive_hash_index              | ON                     | 
| innodb_doublewrite                      | ON                     | 
| innodb_fast_shutdown                    | 1                      | 
| innodb_file_io_threads                  | 4                      | 
| innodb_file_per_table                   | ON                     | 
| innodb_flush_log_at_trx_commit          | 1                      | 
| innodb_flush_method                     |                        | 
| innodb_force_recovery                   | 0                      | 
| innodb_lock_wait_timeout                | 50                     | 
| innodb_locks_unsafe_for_binlog          | OFF                    | 
| innodb_log_arch_dir                     |                        | 
| innodb_log_archive                      | OFF                    | 
| innodb_log_buffer_size                  | 1048576                | 
| innodb_log_file_size                    | 5242880                | 
| innodb_log_files_in_group               | 2                      | 
| innodb_log_group_home_dir               | ./                     | 
| innodb_max_dirty_pages_pct              | 90                     | 
| innodb_max_purge_lag                    | 0                      | 
| innodb_mirrored_log_groups              | 1                      | 
| innodb_open_files                       | 300                    | 
| innodb_rollback_on_timeout              | OFF                    | 
| innodb_support_xa                       | ON                     | 
| innodb_sync_spin_loops                  | 20                     | 
| innodb_table_locks                      | ON                     | 
| innodb_thread_concurrency               | 8                      | 
| innodb_thread_sleep_delay               | 10000                  | 
| innodb_use_legacy_cardinality_algorithm | ON                     | 
+-----------------------------------------+------------------------+