この章では、InnoDB
に関連するコマンドオプションとシステム変数を紹介します。ブール型のシステム変数は、サーバー起動時にそれらを指定することで有効にしたり、--skip
接頭辞を利用することで無効にしたりできます。たとえば、InnoDB
チェックサムを有効、または無効にするには、コマンドライン上で
--innodb_checksums
か
--skip-innodb_checksums
を、またはオプションファイル内で
innodb_checksums
か skip-innodb_checksums
を利用することができます。数値を取るシステム変数は、コマンドライン上で
--
として、またはオプションファイル内で
var_name
=value
として指定することができます。オプションとシステム変数を指定することに関する更なる情報は、Specifying Program Options
を参照してください。多くのシステム変数は起動時に変更できます
(Dynamic System Variablesを参照)。
var_name
=value
表 9.2. mysqld InnoDB オプション/変数リファレンス
InnoDB
コマンドオプション:
このオプションを指定すると、サーバーの動作が、まるで組み込み
InnoDB
が存在していないかのようになります。これを指定すると、ほかの
InnoDB
オプションが認識されなくなります。このオプションは
MySQL 5.1.33.で追加されました。
サーバーが InnoDB
サポートでコンパイルされた場合に、InnoDB
ストレージエンジンの読み込みを制御します。MySQL
5.1.36 以降、このオプションは 3
つの状態を取る形式となっており、OFF
、ON
、FORCE
のいずれかの値を指定できます。MySQL 5.1.36
より前では、これはブール型のオプションです。InnoDB
を有効にするには
--innodb
を、無効にするには
--skip-innodb
を、それぞれ使用します。Server Options for Loading Plugins
を参照してください。
InnoDB
が MySQL
のデータディレクトリ内に
innodb_status.
という名前のファイルを作成するかどうかを制御します。有効にすると、<pid>
InnoDB
は定期的に
SHOWENGINEINNODBSTATUS
の出力をこのファイルに書き込みます。
このファイルはデフォルトでは作成されません。これを作成するには、mysqld
の起動時に
--innodb_status_file=1
オプションを指定します。このファイルは、通常のシャットダウン中に削除されます。
InnoDB
システム変数:
導入されたバージョン | 5.1.33 | ||
コマンドラインの形式 | --ignore-builtin-innodb |
||
設定ファイルの形式 | ignore_builtin_innodb |
||
オプションによる変数の設定 | はい。ignore_builtin_innodb
|
||
変数名 | ignore_builtin_innodb |
||
変数のスコープ | グローバル | ||
動的変数 | No | ||
許可される値 |
|
サーバー起動時に
--ignore-builtin-innodb
オプションが指定されたかどうか。このオプションが指定されると、サーバーの動作が、まるで組み込み
InnoDB
が存在していないかのようになります。(MySQL
5.1.33 からの導入)
導入されたバージョン | 5.1.24 | ||||
コマンドラインの形式 | --innodb_adaptive_hash_index=# |
||||
設定ファイルの形式 | innodb_adaptive_hash_index |
||||
オプションによる変数の設定 | はい。innodb_adaptive_hash_index
|
||||
変数名 | innodb_adaptive_hash_index |
||||
変数のスコープ | グローバル | ||||
動的変数 | No | ||||
許可される値 |
|
InnoDB
の適応型ハッシュインデックスを有効、無効のいずれにするか
(項9.10.4. 「適応型ハッシュインデックス」を参照)。この変数はデフォルトで有効にされています。これを無効にするには、サーバー起動時に
--skip-innodb_adaptive_hash_index
を指定します。(MySQL 5.1.24 からの導入)
innodb_additional_mem_pool_size
コマンドラインの形式 | --innodb_additional_mem_pool_size=# |
||||||
設定ファイルの形式 | innodb_additional_mem_pool_size |
||||||
オプションによる変数の設定 | はい。innodb_additional_mem_pool_size
|
||||||
変数名 | innodb_additional_mem_pool_size |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
InnoDB
がデータ辞書情報と別の内部データ構造を格納するために利用する、メモリープールのバイトでのサイズです。より多くのテーブルをアプリケーション内に持っていると、ここに割り当てるためにより多くのメモリーが必要になります。もし
InnoDB
がこのプール内のメモリーを使い果たしてしまったら、これは
OS からメモリーを割り当て始め、MySQL
エラーログに警告メッセージを書きます。デフォルトの値は
1M バイトです。
コマンドラインの形式 | --innodb_autoextend_increment=# |
||||||
設定ファイルの形式 | innodb_autoextend_increment |
||||||
オプションによる変数の設定 | はい。innodb_autoextend_increment
|
||||||
変数名 | innodb_autoextend_increment |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
自動拡大テーブル領域ファイルがいっぱいになったときにサイズを拡大するためのインクリメントサイズ (M バイト)。デフォルト値は 8 です。
削除されたバージョン | 5.1.13 | ||||||
コマンドラインの形式 | --innodb_buffer_pool_awe_mem_mb=# |
||||||
設定ファイルの形式 | innodb_buffer_pool_awe_mem_mb |
||||||
オプションによる変数の設定 | はい。innodb_buffer_pool_awe_mem_mb
|
||||||
変数名 | innodb_buffer_pool_awe_mem_mb |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
プラットフォーム固有 | windows | ||||||
許可される値 |
|
AWE
メモリー内に置かれたときの、バッファープールのサイズ
(M バイト)。もしこれが 0
以上なら、innodb_buffer_pool_size
は InnoDB
がその AWE
メモリーをマップする
mysqld の 32
ビットアドレス領域内のウィンドウです。innodb_buffer_pool_size
の適正な値は 500M
バイトです。指定可能な最大値は、63000
です。
AWE メモリーを活用するには、自分で MySQL
をリコンパイルする必要があります。これを行うのに必要な現在のプロジェクト設定は、storage/innobase/os/os0proc.c
ソースファイル内で見つけることができます。
この変数は MySQL 5.1.13
で削除されました。それより前では、これは
32 ビット Windows
でしか意味を持ちません。もしお使いの 32
ビット Windows OS が 4G
バイト以上のメモリーをサポートするなら、いわゆる
「Address Windowing Extensions,」
を利用することで、この変数を利用して
InnoDB
バッファープールを AWE
物理的メモリーに割り当てることができます。
導入されたバージョン | 5.1.22 | ||||
コマンドラインの形式 | --innodb_autoinc_lock_mode=# |
||||
設定ファイルの形式 | innodb_autoinc_lock_mode |
||||
オプションによる変数の設定 | はい。innodb_autoinc_lock_mode
|
||||
変数名 | innodb_autoinc_lock_mode |
||||
変数のスコープ | グローバル | ||||
動的変数 | No | ||||
許可される値 |
|
自動インクリメント値の生成に使用するロックモード。許可される値は
0、1、2 で、それぞれ
「従来」、「連続」、「インターリーブ」
の各ロックモードに対応しています。これらのモードの特徴については、項9.4.3. 「InnoDB
の
AUTO_INCREMENT
処理」
を参照してください。
この変数は、MySQL 5.1.22 でデフォルト値 1
(「連続」 ロックモード)
として追加されました。5.1.22
より前では、InnoDB
は 「従来」
ロックモードを使用します。
コマンドラインの形式 | --innodb_buffer_pool_size=# |
||||||
設定ファイルの形式 | innodb_buffer_pool_size |
||||||
オプションによる変数の設定 | はい。innodb_buffer_pool_size
|
||||||
変数名 | innodb_buffer_pool_size |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
プラットフォーム固有 | windows | ||||||
許可される値 |
|
InnoDB
がそのテーブルのデータとインデックスをキャッシュするために利用する、メモリーバッファーのバイトでのサイズです。デフォルトの値は
8M
バイトです。この値を大きく設定するほど、テーブル内のデータにアクセスするのに必要なディスク
I/O
は少なくなります。専用のデータベースサーバー上で、これをマシンの物理的メモリーサイズの最大
80%
に設定すると良いでしょう。しかし、物理的メモリーの競合が
OS
内でページングを引き起こす可能性があるので、あまり大きく設定しないでください。
コマンドラインの形式 | --innodb_checksums |
||||
設定ファイルの形式 | innodb_checksums |
||||
オプションによる変数の設定 | はい。innodb_checksums
|
||||
変数名 | innodb_checksums |
||||
変数のスコープ | グローバル | ||||
動的変数 | No | ||||
許可される値 |
|
InnoDB
は、壊れたハードウェアやデータファイルに対する追加フォールトトレランスを保証するディスクからのすべてのページの読み込み上で、チェックサムの妥当性確認を利用することができます。この妥当性確認はデフォルトで有効にされています。しかし、まれに
(ベンチマークが起動している時等)、この追加安全機能は必要なく、--skip-innodb-checksums
を利用して無効にすることができます。
コマンドラインの形式 | --innodb_commit_concurrency=# |
||||||
設定ファイルの形式 | innodb_commit_concurrency |
||||||
オプションによる変数の設定 | はい。innodb_commit_concurrency
|
||||||
変数名 | innodb_commit_concurrency |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
同時にコミットすることができるスレッドの数。値 0 (デフォルト) を指定した場合、任意の数のトランザクションが同時にコミットできます。
MySQL 5.1.36 以降では、実行時に
innodb_commit_concurrency
の値をゼロからゼロ以外の値に変更したりその逆を行ったりすることはできません。値をゼロ以外のある値から別の値に変更することは可能です。
コマンドラインの形式 | --innodb_concurrency_tickets=# |
||||||
設定ファイルの形式 | innodb_concurrency_tickets |
||||||
オプションによる変数の設定 | はい。innodb_concurrency_tickets
|
||||||
変数名 | innodb_concurrency_tickets |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
InnoDB
に同時に入ることができるスレッドの数は、innodb_thread_concurrency
変数によって決められます。スレッドが
InnoDB
に入ろうとするときにもし並行処理の限度までスレッド数が達していたら、それらは列になります。スレッドが
InnoDB
に入るのを許可されると、innodb_concurrency_tickets
の値と同等の 「フリーチケット」
をたくさん与えられ、スレッドはそのチケットを使ってしまうまでは自由に
InnoDB
に出入りできます。それ以降は、スレッドが次に
InnoDB
に入ろうとしたときに、再度並行処理確認の対象となります。(または列に並ぶ可能性もある)デフォルト値は
500 です。
コマンドラインの形式 | --innodb_data_file_path=name |
||
設定ファイルの形式 | innodb_data_file_path |
||
変数名 | innodb_data_file_path |
||
変数のスコープ | グローバル | ||
動的変数 | No | ||
許可される値 |
|
独立したデータファイルとそれらのサイズへのパス。各データファイルへの完全ディレクトリパスは、ここに指定された各パスへの
innodb_data_home_dir
を結合することによって形作られます。ファイルサイズは、サイズ値に
K
、M
、または
G
を付加して、K
バイト、M バイト、または G バイト (1024M
バイト)
で指定されます。ファイルサイズの合計は最低
10M バイト必要です。もし
innodb_data_file_path
を指定しなければ、デフォルト動作で
ibdata1
と名づけられた 10M
バイトの単一自動拡大データファイルが作成されます。各ファイルのサイズ制限は
OS
によって決定されます。大きいファイルをサポートする
OS のサイズを 4G
バイト以上に設定することができます。raw
ディスクパーティションをデータファイルとして利用することもできます。InnoDB
のテーブル領域ファイルを設定する方法の詳細については、項9.2. 「InnoDB
設定」
を参照してください。
コマンドラインの形式 | --innodb_data_home_dir=name |
||
設定ファイルの形式 | innodb_data_home_dir |
||
オプションによる変数の設定 | はい。innodb_data_home_dir
|
||
変数名 | innodb_data_home_dir |
||
変数のスコープ | グローバル | ||
動的変数 | No | ||
許可される値 |
|
共有テーブル領域に含まれるすべての
InnoDB
データファイルのディレクトリパスの共通部分。innodb_file_per_table
が有効な場合、この設定はファイル単位テーブル領域の場所には影響を与えません。デフォルト値は、MySQL
のデータディレクトリです。値を空の文字列として指定した場合には、innodb_data_file_path
内で完全なファイルパスを使用することができます。
コマンドラインの形式 | --innodb-doublewrite |
||
設定ファイルの形式 | innodb_doublewrite |
||
オプションによる変数の設定 | はい。innodb_doublewrite
|
||
変数名 | innodb_doublewrite |
||
変数のスコープ | グローバル | ||
動的変数 | No | ||
許可される値 |
|
この変数が有効 (デフォルト)
な場合、InnoDB
はすべてのデータを 2 回格納します。1
回目は二重書き込みバッファーに、そして次に実際のデータファイルに格納します。この変数は、データの整合性や起こり得る失敗に対する心配よりも、ベンチマークや最高性能が要求されるときに、--skip-innodb_doublewrite
を利用して止めることができます。
コマンドラインの形式 | --innodb_fast_shutdown[=#] |
||||||
設定ファイルの形式 | innodb_fast_shutdown |
||||||
オプションによる変数の設定 | はい。innodb_fast_shutdown
|
||||||
変数名 | innodb_fast_shutdown |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
InnoDB
のシャットダウンモード。デフォルトの値は 1
で、その場合には 「高速」
シャットダウン
(通常タイプのシャットダウン)
が実行されます。値が 0
の場合、InnoDB
は完全な消去と挿入バッファーのマージを行ってから、シャットダウンを行います。これらの操作には数分間、または極端な場合には数時間かかることがあります。値が
1 の場合、InnoDB
はシャットダウン時にこれらの処理をスキップします。値が
2 の場合、InnoDB
はそのログをフラッシュし、まるで MySQL
がクラッシュしたかのように急にシャットダウンします。コミットされたトランザクションはなくなりませんが、次の起動の際にクラッシュ復旧が行われます。2
の値は NetWare 上では利用できません。
コマンドラインの形式 | --innodb_file_io_threads=# |
||||||
設定ファイルの形式 | innodb_file_io_threads |
||||||
オプションによる変数の設定 | はい。innodb_file_io_threads
|
||||||
変数名 | innodb_file_io_threads |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
InnoDB
内のファイル
I/O
スレッド数。通常、これはデフォルト値である
4 のままにしておくべきですが、Windows
上のディスク I/O
にとってはそれよりも大きい値の方がよいかもしれません。Unix
上では、数値を増やしても効果はありません。InnoDB
は必ずデフォルト値を利用します。
コマンドラインの形式 | --innodb_file_per_table |
設定ファイルの形式 | innodb_file_per_table |
変数名 | innodb_file_per_table |
変数のスコープ | グローバル |
動的変数 | No |
innodb_file_per_table
が無効 (デフォルト)
な場合、InnoDB
は共有テーブル領域にテーブルを作成します。innodb_file_per_table
を有効にすると、InnoDB
はデータとインデックスを共有テーブル領域に格納するのではなく、それ自体の
.ibd
ファイルを利用してそれぞれの新しいテーブルを作成し、そこに格納します。項9.2.1. 「Per-Table テーブル領域を利用する」
を参照してください。
innodb_flush_log_at_trx_commit
コマンドラインの形式 | --innodb_flush_log_at_trx_commit[=#] |
||||||
設定ファイルの形式 | innodb_flush_log_at_trx_commit |
||||||
オプションによる変数の設定 | はい。innodb_flush_log_at_trx_commit
|
||||||
変数名 | innodb_flush_log_at_trx_commit |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
innodb_flush_log_at_trx_commit
が 0 の場合、ログバッファーは 1 秒に 1
回ログファイルに書き込まれ、ディスク操作へのフラッシュはログファイル上で行われますが、トランザクションコミットの際には何も行われません。値が
1 (デフォルト)
のときは、ログファイルは各トランザクションコミットのときにログファイルに書き込まれ、ディスク操作へのフラッシュはログファイル上で行われます。値が
2
の場合、ログバッファーはコミットごとにファイルに書き込まれますが、ディスク操作へのフラッシュはそこでは行われません。しかし、値が
2 のときもログファイル上でのフラッシュは 1
秒に 1 回行われます。1 秒に 1
回のフラッシュは、処理スケジュールの発行のため
100%
保証されたものではないということに注意してください。
デフォルト値の 1 が、ACID
に準拠するために必要な値です。より良い性能のために
1
以外の値を設定することもできますが、その場合
1 つのクラッシュの中で最大 1
秒分のトランザクションを失う可能性があります。値が
0 の場合、mysqld
プロセスがクラッシュするたびに、直前の 1
秒間のトランザクションが消去される可能性があります。値が
2
の場合、オペレーティングシステムがクラッシュした場合と停電が発生した場合にのみ、直前の
1
秒間のトランザクションが消去される可能性があります。しかし、InnoDB
のクラッシュ復旧は影響を受けないので、値に関係なくクラッシュ復旧は行われます。
InnoDB
とトランザクションを共に利用してレプリケーション設定で最大の耐久力と一貫性を得るには、お使いのマスタサーバー
my.cnf
内で
innodb_flush_log_at_trx_commit =
1
および sync_binlog =
1
を使用してください。
多くの OS
といくつかのディスクハードウェアはディスクへのフラッシュ操作を欺くことがあります。それらはフラッシュが行われていなくても、行われたと
mysqld
に伝える可能性があります。1
の設定がしてあってもトランザクションの耐久力が保証されないということになり、さらに悪いことに、停電によって
InnoDB
データベースが破損する可能性もあります。SCSI
ディスクコントローラ内やディスク自体の中での、バッテリーに頼っているディスクキャッシュの利用はファイルフラッシュのスピートを上げ、操作を安全に行うことができます。ハードウェアキャッシュ内でディスク書き込みのキャッシュを無効にするために、Unix
コマンド hdparm
を利用してみたり、ハードウェアベンダに対しての特定の別のコマンドを利用したりもできます。
コマンドラインの形式 | --innodb_flush_method=name |
||||||
設定ファイルの形式 | innodb_flush_method |
||||||
オプションによる変数の設定 | はい。innodb_flush_method
|
||||||
変数名 | innodb_flush_method |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
||||||
許可される値 |
|
||||||
許可される値 |
|
||||||
許可される値 |
|
デフォルトでは、InnoDB
は fsync()
を使ってデータとログファイルの両方のフラッシュを行います。innodb_flush_method
オプションが O_DSYNC
に設定されると、InnoDB
はログファイルをオープン、フラッシュするために
O_SYNC
を使用し、データファイルをフラッシュするために
fsync()
を使用します。(一部の GNU/Linux
バージョン、FreeBSD、および Solaris
で利用可能な)
O_DIRECT
が指定されると、InnoDB
はデータファイルをオープンするために
O_DIRECT
(Solaris では
directio()
)
を利用し、データとログファイルの両方をフラッシュするために
fsync()
を利用します。InnoDB
は fdatasync()
の代わりに fsync()
を利用すること、また様々な種類の Unix
上で問題があったため、デフォルトで
O_DSYNC
は利用しないということに注意してください。この変数は
Unix に対してだけ関連があります。Windows
上では、フラッシュの方法は毎回
async_unbuffered
で、変更することはできません。
この変数の異なる値は InnoDB
のパフォーマンスに著しい影響を持ちます。たとえば、InnoDB
データとログファイルが SAN
上に位置するいくつかのシステム上では、innodb_flush_method
を O_DIRECT
に設定することは、3
つの要因によってシンプルな
SELECT
ステートメントの性能を劣らせる可能性があるということが発見されました。
以前は、デフォルト動作を実現するために値
fdatasync
を指定できました。MySQL 5.1.24
以降ではそれが不可能になりました。というのも、値
fdatasync
を指定した場合に
fdatasync()
ではなく
fsync()
を使ってフラッシュが行われるのは、混乱を招く可能性があるからです。
コマンドラインの形式 | --innodb_force_recovery=# |
||||||
設定ファイルの形式 | innodb_force_recovery |
||||||
オプションによる変数の設定 | はい。innodb_force_recovery
|
||||||
変数名 | innodb_force_recovery |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
クラッシュ復旧モード。指定可能な値は 0
から 6
までです。これらの値の意味については、項9.6.2. 「InnoDB
復旧の強制」
を参照してください。
この変数は、破損したデータベースからテーブルをダンプする必要があるという緊急の場合のみ、0
より大きな値に設定すべきです。安全策として、InnoDB
はこの変数が 0
以上のときはそのデータへの変更を阻止します。
コマンドラインの形式 | --innodb_lock_wait_timeout=# |
||||||
設定ファイルの形式 | innodb_lock_wait_timeout |
||||||
オプションによる変数の設定 | はい。innodb_lock_wait_timeout
|
||||||
変数名 | innodb_lock_wait_timeout |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
InnoDB
のトランザクションが行ロックの取得をあきらめるまでに待機するタイムアウト秒数。デフォルトは
50 秒。ある InnoDB
トランザクションによってロックされている行へのアクセスを試みる別のトランザクションは、この秒数だけ最大待ったあと、次のエラーを発行します。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
ロック待ちタイムアウトが発生すると、現在のステートメントは実行されません。現在のトランザクションはロールバックされません。(トランザクション全体をロールバックさせるには、MySQL
5.1.15 以降で利用可能な
--innodb_rollback_on_timeout
オプションを指定してサーバーを起動する。項9.12. 「InnoDB
エラー処理」も参照。)
innodb_lock_wait_timeout
は InnoDB
の行ロックにのみ適用されます。MySQL
のテーブルロックは
InnoDB
の内側で発生するわけではないので、このタイムアウトはテーブルロックの待機には適用されません。
InnoDB
は、自身のロックテーブルのトランザクションデッドロックを即座に検出し、トランザクションを
1
つロールバックします。ロック待ちタイムアウト値はそのような待機には適用されません。
innodb_locks_unsafe_for_binlog
コマンドラインの形式 | --innodb_locks_unsafe_for_binlog |
||||
設定ファイルの形式 | innodb_locks_unsafe_for_binlog |
||||
オプションによる変数の設定 | はい。innodb_locks_unsafe_for_binlog
|
||||
変数名 | innodb_locks_unsafe_for_binlog |
||||
変数のスコープ | グローバル | ||||
動的変数 | No | ||||
許可される値 |
|
この変数は、InnoDB
がギャップロックを使って検索やインデックス走査を行う方法に影響を与えます。InnoDB
では通常、インデックス行ロックとギャップロックを組み合わせた「ネクストキーロック」と呼ばれるアルゴリズムが使用されます。InnoDB
は、それがテーブルインデックスを検索や走査するときに、遭遇したインデックスレコード上で共有または排他ロックを設定する、という方法で行レベルロックを実行します。従って、行レベルロックは実際はインデックスレコードロックであるということになります。さらに、あるインデックスレコードに対するネクストキーロックは、そのインデックスレコードの前の
「ギャップ」
にも影響を与えます。つまり、ネクストキーロックは、インデックスレコードロックと、そのインデックスレコードの前のギャップに対するギャップロックとを組み合わせたものです。あるセッションがインデックス内のレコード
R
上に共有または排他ロックを持っている場合、別のセッションがインデックスの順番で
R
の直前にあたるギャップに新しいインデックスレコードを挿入することはできません。項9.8.4. 「InnoDB
レコード、ギャップ、およびネクストキーロック」
を参照してください。
innodb_locks_unsafe_for_binlog
の値はデフォルトで 0 (無効)
になっていますが、これは、ギャップロックが有効であることを意味します。InnoDB
はネクストキーロックを使って検索やインデックス走査を行います。この変数を有効にするには、値を
1
に設定します。そうするとギャップロックが無効になります。InnoDB
はインデックスレコードロックのみを使って検索やインデックス走査を行います。
innodb_locks_unsafe_for_binlog
を有効にしても、外部キー制約チェックや重複キー確認でのギャップロック使用は無効になりません。
innodb_locks_unsafe_for_binlog
を有効にした場合の影響は、トランザクション遮断レベルを
READ
COMMITTED
に設定した場合の影響に似ていますが、同じではありません。
innodb_locks_unsafe_for_binlog
の有効化はグローバル設定であり、すべてのセッションに影響が及ぶのに対し、遮断レベルの設定はすべてのセッションに対してグローバルに行うことも、個々のセッションごとに行うこともできます。
innodb_locks_unsafe_for_binlog
はサーバー起動時にしか設定できないのに対し、遮断レベルは起動時に設定することも実行時に変更することもできます。
したがって、READ
COMMITTED
は
innodb_locks_unsafe_for_binlog
よりも細かく柔軟な制御を提供すると言えます。ギャップロックに対する遮断レベルの影響に関する追加の詳細については、項8.4.6. 「SET TRANSACTION
構文」
を参照してください。
innodb_locks_unsafe_for_binlog
を有効にするとファントムの問題が発生する可能性があります。なぜなら、ギャップロックが無効だとほかのセッションが新しい行をギャップに挿入できるからです。child
テーブルの id
カラム上にインデックスが設定された状態で、次のように識別子の値が
100
より大きいすべての行をテーブルから読み取り、その選択された行の特定のカラムをあとで更新できるようにそれらの行をロックするものとします。
SELECT * FROM child WHERE id > 100 FOR UPDATE;
クエリーは、id
が
100
より大きい最初のレコードからインデックスを走査します。その範囲内のインデックスレコード上に設定されたロックがギャップへの挿入を禁止しなければ、別のセッションがそのテーブルに新しい行を挿入することができます。したがって、同じトランザクション内で同じ
SELECT
を再度実行すると、クエリーから返された結果セット内に新しい行を見つけることができます。これは、もしデータベースに新しい項目が追加されると、InnoDB
はシリアリザビリティを保証しないということも意味します。したがって、innodb_locks_unsafe_for_binlog
が有効な場合に
InnoDB
によって保証される最大の遮断レベルは、READ
COMMITTED
になります。(コンフリクトシリアリザビリティは保証されたままです)。ファントムの追加情報については、項9.8.5. 「ネクストキーロックによるファントム問題の回避」
を参照してください。
innodb_locks_unsafe_for_binlog
を有効にした場合には、次のような影響も発生します。
UPDATE
または
DELETE
ステートメントでは、InnoDB
は更新または削除の対象となる行に対してのみ、ロックを保持します。マッチしなかった行のレコードロックは、MySQL
による WHERE
条件の評価後に解放されます。このおかげでデッドロックの可能性が大幅に低くなりますが、それでもまだ起こる可能性があります。
UPDATE
ステートメントである行がすでにロックされていた場合、InnoDB
は 「半一貫性」
読み取りを実行し、最後にコミットされたバージョンを
MySQL に返すため、MySQL はその行が
UPDATE
の
WHERE
条件にマッチするかどうかを判定することができます。その行がマッチした場合
(その行を更新する必要がある場合)、MySQL
はその行を再度読み取り、InnoDB
は今度はその行をロックするか、その行のロックが解放されるのを待ちます。
このテーブルから始まる、次の例を検討してみてください:
CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB; INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2); COMMIT;
この場合はテーブルにインデックスが設定されていないので、検索やインデックス走査では、隠しクラスタインデックスを使ってレコードのロックが行われます (項9.10.1. 「クラスタインデックスと二次インデックス」を参照)。
あるクライアントが次のステートメントを使って
UPDATE
を実行するとします。
SET autocommit = 0; UPDATE t SET b = 5 WHERE b = 3;
別のクライアントが最初のクライアントの実行後に次のステートメントを実行することで、UPDATE
を実行するものとします。
SET autocommit = 0; UPDATE t SET b = 4 WHERE b = 2;
InnoDB
は各
UPDATE
を実行する際に、まず各行の排他ロックを取得し、次にその行を変更するかどうかを判定します。InnoDB
がその行を変更せず、かつ
innodb_locks_unsafe_for_binlog
が有効な場合には、そのロックが解放されます。それ以外の場合、トランザクションが終了するまで
InnoDB
はそのロックを保持します。これは、トランザクション処理に次のような影響を及ぼします。
innodb_locks_unsafe_for_binlog
が無効な場合は次のように、最初の
UPDATE
は X
ロックを取得し、それらを一切解放しません。
x-lock(1,2); retain x-lock x-lock(2,3); update(2,3) to (2,5); retain x-lock x-lock(3,2); retain x-lock x-lock(4,3); update(4,3) to (4,5); retain x-lock x-lock(5,2); retain x-lock
次のように、2 番目の
UPDATE
は
(最初の更新がすべての行のロックを保持しているので)
どのロックを取得しようとしてもすぐにブロックしてしまい、最初の
UPDATE
がコミットかロールバックを実行するまで処理を進めることができません。
x-lock(1,2); block and wait for first UPDATE to commit or roll back
innodb_locks_unsafe_for_binlog
が有効な場合は次のように、最初の
UPDATE
は X
ロックを取得したあと、変更しない行のロックは解放します。
x-lock(1,2); unlock(1,2) x-lock(2,3); update(2,3) to (2,5); retain x-lock x-lock(3,2); unlock(3,2) x-lock(4,3); update(4,3) to (4,5); retain x-lock x-lock(5,2); unlock(5,2)
2 番目の UPDATE
では次のように、InnoDB
は 「半一貫性」
読み取りを行い、最後にコミットされたバージョンを
MySQL に返すため、MySQL はその行が
UPDATE
の
WHERE
条件にマッチするかどうかを判定することができます。
x-lock(1,2); update(1,2) to (1,4); retain x-lock x-lock(2,3); unlock(2,3) x-lock(3,2); update(3,2) to (3,4); retain x-lock x-lock(4,3); unlock(4,3) x-lock(5,2); update(5,2) to (5,4); retain x-lock
半一貫性読み取りが利用できるのは MySQL 5.1.5
以降です。5.1.5 より前では、2 番目の
UPDATE
は、途中まで処理が進んだところでブロックしてしまいます。これは
X ロックの取得を開始しますが、最初の
UPDATE
によってまだロックされている行のロックを取得しようとした時点でブロックします。次のように、2
番目の
UPDATE
は最初の
UPDATE
がコミットかロールバックを実行するまで処理を進めることができません。
x-lock(1,2); update(1,2) to (1,4); retain x-lock x-lock(2,3); block and wait for first UPDATE to commit or roll back
この場合、2 番目の
UPDATE
は、影響を与える行が異なっているにもかかわらず、最初の
UPDATE
がコミットかロールバックを実行するまで待つ必要があります。最初の
UPDATE
は行
(2,3)
の排他ロックを保持しており、まだ解放していません。2
番目の
UPDATE
は行の走査時にその同じ行の排他ロックを取得しようとしますが、取得することができません。したがって、MySQL
5.1.5
より前では、innodb_locks_unsafe_for_binlog
を有効にしたとしても、UPDATE
などの操作をほかの類似操作 (別の
UPDATE
など)
のあとから実行して先に終了させることは、たとえ両者が影響を及ぼす行が異なっていても不可能です。
この変数は推奨されないため、MySQL 5.1.21 で削除されました。
この変数は推奨されないため、MySQL 5.1.18 で削除されました。
コマンドラインの形式 | --innodb_log_buffer_size=# |
||||||
設定ファイルの形式 | innodb_log_buffer_size |
||||||
オプションによる変数の設定 | はい。innodb_log_buffer_size
|
||||||
変数名 | innodb_log_buffer_size |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
InnoDB
がディスク上のログファイルに書き込むために利用するバッファーのバイトでのサイズ。デフォルトの値は
1M バイトです。実用的な値の範囲は 1M
バイトから 8M
バイトです。大きいログバッファーは、トランザクションコミットの前にディスクにログを書き込む必要なく、大きいトランザクションが起動することを許容します。従って、もし大きいトランザクションを持っていたら、ログファイルを大きくしておくことでディスク
I/O を節約することができます。
コマンドラインの形式 | --innodb_log_file_size=# |
||||||
設定ファイルの形式 | innodb_log_file_size |
||||||
オプションによる変数の設定 | はい。innodb_log_file_size
|
||||||
変数名 | innodb_log_file_size |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
ロググループ内のそれぞれの長いファイルのバイトでのサイズ。結合したログファイルのサイズは
4G
バイト未満でなければいけません。デフォルトの値は
5M
バイトです。実用的な値は、N
がグループ内のログファイル数だとして、バッファープールのサイズの
1M バイトから 1/N
-th
です。この値が大きいほどバッファープールで必要となるチェックポイントフラッシュアクティビティーが少なくなり、ディスク入出力の低減を図れます。ただし、ログファイルが大きくなるということは、クラッシュ時の復旧時間が長くなることも意味します。
コマンドラインの形式 | --innodb_log_files_in_group=# |
||||||
設定ファイルの形式 | innodb_log_files_in_group |
||||||
オプションによる変数の設定 | はい。innodb_log_files_in_group
|
||||||
変数名 | innodb_log_files_in_group |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
ロググループ内のログファイル数。InnoDB
はファイルに輪状に書き込みをします。デフォルト
(そして推奨) の値は 2 です。
コマンドラインの形式 | --innodb_log_group_home_dir=name |
||
設定ファイルの形式 | innodb_log_group_home_dir |
||
オプションによる変数の設定 | はい。innodb_log_group_home_dir
|
||
変数名 | innodb_log_group_home_dir |
||
変数のスコープ | グローバル | ||
動的変数 | No | ||
許可される値 |
|
InnoDB
ログファイルへのディレクトリパス。もし
InnoDB
ログ変数を何も指定しなければ、デフォルトで
MySQL データディレクトリ内に
ib_logfile0
と
ib_logfile1
という名前の 2 つの 5M
バイトファイルを作成します。
コマンドラインの形式 | --innodb_max_dirty_pages_pct=# |
||||||
設定ファイルの形式 | innodb_max_dirty_pages_pct |
||||||
オプションによる変数の設定 | はい。innodb_max_dirty_pages_pct
|
||||||
変数名 | innodb_max_dirty_pages_pct |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
これは 0 から 100
の範囲の間の整数です。デフォルト値は 90
です。InnoDB
内の主スレッドは、ダーティ
(まだ書き込まれていない)
ページの割合がこの値を超えないようにバッファープールからページを書くように試みます。
コマンドラインの形式 | --innodb_max_purge_lag=# |
||||||
設定ファイルの形式 | innodb_max_purge_lag |
||||||
オプションによる変数の設定 | はい。innodb_max_purge_lag
|
||||||
変数名 | innodb_max_purge_lag |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
この変数は、消去操作が遅れているときに
(を参照)
INSERT、
UPDATE、および
DELETE項9.9. 「InnoDB
マルチバージョン管理」
操作をどのように遅らせるかをコントロールします。デフォルト値は
0 (遅延なし) です。
InnoDB
トランザクションシステムは
UPDATE
か
DELETE
操作によって削除マークが付けられたインデックスレコードを持つトランザクションのリストを保持します。このリストの長さを
purge_lag
にしてください。purge_lag
が
innodb_max_purge_lag
を上回るとき、各
INSERT
、UPDATE
、および
DELETE
操作は
((purge_lag
/innodb_max_purge_lag
)×10)–5
ミリ秒遅れます。遅れは消去バッチの最初に、10
秒ごとに計算されます。もし消去される行をを知ることができる、古い一貫性読み取りビューのために消去が起動しなかったら、その操作は遅れません。
作業負荷が不明な場合の典型的な設定は、トランザクションが小規模でサイズが
100 バイトしかなく、未消去の
InnoDB
テーブル行が
100M
バイト存在していても問題ないと仮定すれば、100
万です。
データベースのために残すロググループの同一コピー数。これは 1 に設定すべきです。
コマンドラインの形式 | --innodb_open_files=# |
||||||
設定ファイルの形式 | innodb_open_files |
||||||
変数名 | innodb_open_files |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | No | ||||||
許可される値 |
|
この変数は InnoDB
内で複数のテーブル領域を利用する場合のみ関連があります。それは
InnoDB
が同時にオープンしておける
.ibd
ファイルの最大数を指定します。最小値は 10
です。デフォルト値は 300 です。
.ibd
ファイルに利用されるファイル記述子は、InnoDB
に対してのもののみです。それらは、--open-files-limit
サーバーオプションによって指定されたものからは独立していて、テーブルキャッシュの操作に影響を与えません。
導入されたバージョン | 5.1.15 |
コマンドラインの形式 | --innodb_rollback_on_timeout |
設定ファイルの形式 | innodb_rollback_on_timeout |
オプションによる変数の設定 | はい。innodb_rollback_on_timeout
|
変数名 | innodb_rollback_on_timeout |
変数のスコープ | グローバル |
動的変数 | No |
MySQL 5.1
で、InnoDB
はトランザクションのタイムアウト時に最後のステートメントだけをロールバックします。--innodb_rollback_on_timeout
を指定すると、トランザクションタイムアウトは
InnoDB
がトランザクション全体を異常終了してロールバックするよう働きかけます
(MySQL 4.1 と同じ動作)。この変数は、MySQL 5.1.15
で追加されました。
導入されたバージョン | 5.1.17 | ||||
コマンドラインの形式 | --innodb_stats_on_metadata |
||||
設定ファイルの形式 | innodb_stats_on_metadata |
||||
オプションによる変数の設定 | はい。innodb_stats_on_metadata
|
||||
変数名 | innodb_stats_on_metadata |
||||
変数のスコープ | グローバル | ||||
動的変数 | Yes | ||||
許可される値 |
|
この変数が有効
(この変数が作成される前からのデフォルト)
な場合、SHOW TABLE
STATUS
や SHOW
INDEX
などのメタデータステートメントの実行時や、INFORMATION_SCHEMA
テーブル
TABLES
または
STATISTICS
へのアクセス時に、InnoDB
は統計情報を更新します。(これらの更新は、ANALYZE
TABLE
で行われるものに似ている。)
無効な場合、InnoDB
はそれらの処理中に統計情報を更新しません。この変数を無効にすると、テーブルやインデックスを多数含むスキーマへのアクセス速度が改善される可能性があります。またその場合、InnoDB
テーブルが関係するクエリーの実行計画の安定性も高まる可能性があります。
(MySQL 5.1.17 からの導入)
コマンドラインの形式 | --innodb_support_xa |
||||
設定ファイルの形式 | innodb_support_xa |
||||
オプションによる変数の設定 | はい。innodb_support_xa
|
||||
変数名 | innodb_support_xa |
||||
変数のスコープ | 両方 | ||||
動的変数 | Yes | ||||
許可される値 |
|
この変数が有効 (デフォルト) の場合、XA
トランザクションの 2 段階コミットの
InnoDB
サポートが有効となり、トランザクションの準備時に追加のフラッシュが発生するようになります。
XA
トランザクションを使用しない場合はこの変数を無効にすることができますが、そうした場合にはディスクフラッシュの回数が減り、InnoDB
のパフォーマンスが向上します。
コマンドラインの形式 | --innodb_sync_spin_loops=# |
||||||
設定ファイルの形式 | innodb_sync_spin_loops |
||||||
オプションによる変数の設定 | はい。innodb_sync_spin_loops
|
||||||
変数名 | innodb_sync_spin_loops |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
スレッドが、サスペンドされる前に
InnoDB
相互排他ロックが開放されるのを待つ回数。デフォルト値は
20 です。
コマンドラインの形式 | --innodb_table_locks |
||||
設定ファイルの形式 | innodb_table_locks |
||||
オプションによる変数の設定 | はい。innodb_table_locks
|
||||
変数名 | innodb_table_locks |
||||
変数のスコープ | 両方 | ||||
動的変数 | Yes | ||||
許可される値 |
|
autocommit =
0
の要求を受け入れます。MySQL
はすべてのスレッドがテーブルに対するすべてのロックを解放するまで、
の場合、
InnoDB は
LOCK TABLESLOCK
TABLES ... WRITE
から戻りません。innodb_table_locks
のデフォルト値は 1 です。それはもし
autocommit = 0
なら LOCK
TABLES
は InnoDB
がテーブルを内部的にロックするよう働きかけることを意味します。
コマンドラインの形式 | --innodb_thread_concurrency=# |
||||||
設定ファイルの形式 | innodb_thread_concurrency |
||||||
オプションによる変数の設定 | はい。innodb_thread_concurrency
|
||||||
変数名 | innodb_thread_concurrency |
||||||
変数のスコープ | グローバル | ||||||
動的変数 | Yes | ||||||
許可される値 |
|
InnoDB
は、この変数から与えられた制限よりも少ない、またはそれと同等の制限の
InnoDB
内部に多くの
OS
スレッドを一斉に保存しようと試みます。スレッド数がこの制限に達すると、それ以上のスレッドは、実行用の
FIFO
キュー内で待機状態に置かれます。ロック待ちのスレッドは、同時実行スレッド数としてカウントされません。
この変数の適切な値は環境や作業負荷によって異なります。使用するアプリケーションに適した値を決定するには、さまざまな値を試してみる必要があります。推奨値は、CPU 数の 2 倍にディスク数を加えたものです。
この変数の範囲は 0 から 1000 です。MySQL 5.1.12 より前では、20 以上の値は無限の並列性と解釈されます。5.1.12 以降では、値を 0 に設定すればスレッド並列性確認を無効にすることができます。スレッド並列性確認を無効にすると、InnoDB はスレッドを必要なだけ作成できるようになります。
MySQL 5.1.11 以前はデフォルト値は 20 で、5.1.11 以降は 8 となっています。
コマンドラインの形式 | --innodb_thread_sleep_delay=# |
||||
設定ファイルの形式 | innodb_thread_sleep_delay |
||||
オプションによる変数の設定 | はい。innodb_thread_sleep_delay
|
||||
変数名 | innodb_thread_sleep_delay |
||||
変数のスコープ | グローバル | ||||
動的変数 | Yes | ||||
許可される値 |
|
InnoDB
スレッドは
InnoDB
の列に加わるまでに、マイクロ秒で何秒間スリープ状態にあるか。デフォルト値は
10,000 です。0
の値ではスリープ状態にはなりません。
innodb_use_legacy_cardinality_algorithm
導入されたバージョン | 5.1.35 | ||||
コマンドラインの形式 | --innodb_use_legacy_cardinality_algorithm=# |
||||
設定ファイルの形式 | innodb_use_legacy_cardinality_algorithm |
||||
オプションによる変数の設定 | はい。innodb_use_legacy_cardinality_algorithm
|
||||
変数名 | innodb_use_legacy_cardinality_algorithm |
||||
変数のスコープ | グローバル | ||||
動的変数 | Yes | ||||
許可される値 |
|
InnoDB
は、インデックスのカーディナリティーを計算するためのインデックスへのダイブを生成する際に、乱数を使用します。ところが、特定の条件下でアルゴリズムが乱数を生成しないため、ANALYZE
TABLE
がカーディナリティーの概算値を正しく更新しないことがあります。より優れたランダム化特性を備えた代替アルゴリズムと、使用するアルゴリズムを選択するシステム変数
innodb_use_legacy_cardinality_algorithm
が、MySQL 5.1.35
で導入されました。この変数のデフォルト値は
1 (ON
)
で、その場合には既存アプリケーションとの互換性を維持するために元のアルゴリズムが使用されます。この変数を
0 (OFF
)
に設定すると、ランダム特性が改善された新しいアルゴリズムを使用できます。
5.4 では改良版のアルゴリズムがデフォルトで使用されるため、この変数は使用されません。
sync_binlog
この値が 0 より大きい場合、MySQL
サーバーはバイナリログへの書き込みが
sync_binlog
回発生するたびに、(fdatasync()
を使用して)
バイナリログとディスクとの同期を行います。バイナリログへの書き込みは、自動コミットが有効な場合はステータスごとに
1
回ずつ、それ以外の場合はトランザクションごとに
1
回ずつ発生します。sync_binlog
のデフォルト値は 0
で、これは、ディスクへの同期が行われないことを示します。値を
1
にすると、もっとも安全な設定となる。これはクラッシュした場合などに失うものが、1
ステートメントあるいは 1
トランザクションに留まるためである。しかし、これはパフォーマンスを遅くするため、対応策としては、同期を高速化するために、バッテリバックアップ式キャッシュをディクスに持たせるなどする。