InnoDB
バッファプールのサイズは、オフラインまたはサーバーの実行中に構成できます。 このセクションで説明する動作は、両方の方法に適用されます。 バッファープールサイズをオンラインで構成する方法の詳細は、オンラインでの InnoDB バッファープールサイズの構成 を参照してください。
innodb_buffer_pool_size
を増減すると、操作はチャンク単位で実行されます。 チャンクサイズは、デフォルトの 128M
を持つ innodb_buffer_pool_chunk_size
構成オプションによって定義されます。 詳細は、InnoDB バッファプールのチャンクサイズの構成を参照してください。
バッファプールサイズは、常に innodb_buffer_pool_chunk_size
* innodb_buffer_pool_instances
と等しいか倍数である必要があります。 innodb_buffer_pool_size
を innodb_buffer_pool_chunk_size
* innodb_buffer_pool_instances
と等しくない値または倍数に構成すると、バッファープールサイズは innodb_buffer_pool_chunk_size
* innodb_buffer_pool_instances
と等しいか倍数の値に自動的に調整されます。
次の例では、innodb_buffer_pool_size
が 8G
に設定され、innodb_buffer_pool_instances
が 16
に設定されます。innodb_buffer_pool_chunk_size
は 128M
で、これがデフォルト値です。
8G
は innodb_buffer_pool_instances=16
* innodb_buffer_pool_chunk_size=128M
の倍数 (2G
) であるため、8G
は有効な innodb_buffer_pool_size
値です。
shell> mysqld --innodb-buffer-pool-size=8G --innodb-buffer-pool-instances=16
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 8.000000000000 |
+------------------------------------------+
この例では、innodb_buffer_pool_size
は 9G
に設定され、innodb_buffer_pool_instances
は 16
に設定されます。innodb_buffer_pool_chunk_size
は 128M
で、これがデフォルト値です。 この場合、9G
は innodb_buffer_pool_instances=16
* innodb_buffer_pool_chunk_size=128M
の倍数ではないため、innodb_buffer_pool_size
は 10G
(innodb_buffer_pool_chunk_size
* innodb_buffer_pool_instances
の倍数) に調整されます。
shell> mysqld --innodb-buffer-pool-size=9G --innodb-buffer-pool-instances=16
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 10.000000000000 |
+------------------------------------------+
innodb_buffer_pool_chunk_size
は 1MB (1048576 バイト) 単位で増減できますが、起動時、コマンドライン文字列または MySQL 構成ファイルでのみ変更できます。
コマンドライン:
shell> mysqld --innodb-buffer-pool-chunk-size=134217728
構成ファイル:
[mysqld]
innodb_buffer_pool_chunk_size=134217728
innodb_buffer_pool_chunk_size
を変更する場合は、次の条件が適用されます:
-
バッファプールの初期化時に、新しい
innodb_buffer_pool_chunk_size
値 *innodb_buffer_pool_instances
が現在のバッファプールサイズより大きい場合、innodb_buffer_pool_chunk_size
はinnodb_buffer_pool_size
/innodb_buffer_pool_instances
に切り捨てられます。たとえば、バッファプールが
2GB
(2147483648 バイト)、4
バッファプールインスタンスおよびチャンクサイズ1GB
(1073741824 バイト) で初期化されている場合、次に示すようにチャンクサイズはinnodb_buffer_pool_size
/innodb_buffer_pool_instances
と等しい値に切り捨てられます:shell> mysqld --innodb-buffer-pool-size=2147483648 --innodb-buffer-pool-instances=4 --innodb-buffer-pool-chunk-size=1073741824;
mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 2147483648 | +---------------------------+ mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 4 | +--------------------------------+ # Chunk size was set to 1GB (1073741824 bytes) on startup but was # truncated to innodb_buffer_pool_size / innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 536870912 | +---------------------------------+
-
バッファプールサイズは、常に
innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
と等しいか倍数である必要があります。innodb_buffer_pool_chunk_size
を変更すると、innodb_buffer_pool_size
はinnodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
と等しいか倍数の値に自動的に調整されます。 調整は、バッファープールが初期化されたときに行われます。 この動作を次の例に示します:# The buffer pool has a default size of 128MB (134217728 bytes) mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 134217728 | +---------------------------+ # The chunk size is also 128MB (134217728 bytes) mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 134217728 | +---------------------------------+ # There is a single buffer pool instance mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 1 | +--------------------------------+ # Chunk size is decreased by 1MB (1048576 bytes) at startup # (134217728 - 1048576 = 133169152): shell> mysqld --innodb-buffer-pool-chunk-size=133169152 mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 133169152 | +---------------------------------+ # Buffer pool size increases from 134217728 to 266338304 # Buffer pool size is automatically adjusted to a value that is equal to # or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 266338304 | +---------------------------+
この例では、同じ動作を示しますが、複数のバッファプールインスタンスがあります:
# The buffer pool has a default size of 2GB (2147483648 bytes) mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 2147483648 | +---------------------------+ # The chunk size is .5 GB (536870912 bytes) mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 536870912 | +---------------------------------+ # There are 4 buffer pool instances mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 4 | +--------------------------------+ # Chunk size is decreased by 1MB (1048576 bytes) at startup # (536870912 - 1048576 = 535822336): shell> mysqld --innodb-buffer-pool-chunk-size=535822336 mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 535822336 | +---------------------------------+ # Buffer pool size increases from 2147483648 to 4286578688 # Buffer pool size is automatically adjusted to a value that is equal to # or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 4286578688 | +---------------------------+
前述の例に示すように、この値を変更するとバッファプールのサイズが増加する可能性があるため、
innodb_buffer_pool_chunk_size
を変更する場合は注意が必要です。innodb_buffer_pool_chunk_size
を変更する前に、innodb_buffer_pool_size
への影響を計算して、結果のバッファプールサイズが許容範囲内であることを確認します。
潜在的なパフォーマンスの問題を回避するには、チャンク (innodb_buffer_pool_size
/ innodb_buffer_pool_chunk_size
) の数が 1000 を超えないようにする必要があります。
innodb_buffer_pool_size
構成オプションは、SET
ステートメントを使用して動的に設定でき、サーバーを再起動せずにバッファープールのサイズを変更できます。 例:
mysql> SET GLOBAL innodb_buffer_pool_size=402653184;
バッファープールサイズは innodb_buffer_pool_chunk_size
* innodb_buffer_pool_instances
と等しいか、倍数である必要があります。 これらの変数設定を変更するには、サーバーを再起動する必要があります。
バッファプールのサイズを変更する前に、InnoDB
API を介して実行されるアクティブなトランザクションおよび操作を完了する必要があります。 サイズ変更操作を開始しても、すべてのアクティブなトランザクションが完了するまで操作は開始されません。 サイズ変更操作が進行中になると、バッファプールへのアクセスを必要とする新しいトランザクションおよび操作は、サイズ変更操作が終了するまで待機する必要があります。 ルールの例外は、バッファープールがデフラグされている間はバッファープールへの同時アクセスが許可され、バッファープールサイズが小さくなるとページが取り下げられることです。 同時アクセスを許可するという欠点は、ページの取下げ中に一時的に使用可能なページが不足する可能性があることです。
バッファプールのサイズ変更操作の開始後に開始された場合、ネストされたトランザクションは失敗する可能性があります。
Innodb_buffer_pool_resize_status
では、バッファプールのサイズ変更の進行状況がレポートされます。 例:
mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
+----------------------------------+----------------------------------+
| Variable_name | Value |
+----------------------------------+----------------------------------+
| Innodb_buffer_pool_resize_status | Resizing also other hash tables. |
+----------------------------------+----------------------------------+
バッファプールのサイズ変更の進行状況も、サーバーエラーログに記録されます。 次の例は、バッファープールのサイズを増やすとログに記録されるノートを示しています:
[Note] InnoDB: Resizing buffer pool from 134217728 to 4294967296. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was added.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 134217728 to 4294967296.
[Note] InnoDB: re-enabled adaptive hash index.
次の例は、バッファープールのサイズを小さくしたときに記録されるノートを示しています:
[Note] InnoDB: Resizing buffer pool from 4294967296 to 134217728. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : start to withdraw the last 253952 blocks.
[Note] InnoDB: buffer pool 0 : withdrew 253952 blocks from free list. tried to relocate 0 pages.
(253952/253952)
[Note] InnoDB: buffer pool 0 : withdrawn target 253952 blocks.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was freed.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 4294967296 to 134217728.
[Note] InnoDB: re-enabled adaptive hash index.
サイズ変更操作はバックグラウンドスレッドによって実行されます。 バッファプールのサイズを増やすと、サイズ変更操作は次のようになります:
chunks
にページを追加します (チャンクサイズはinnodb_buffer_pool_chunk_size
によって定義されます)メモリー内の新しいアドレスを使用するためのハッシュテーブル、リスト、およびポインタをカバー
空きリストに新規ページを追加
これらの操作の進行中、他のスレッドはバッファプールへのアクセスをブロックされます。
バッファプールのサイズを小さくすると、サイズ変更操作は次のようになります:
バッファプールをデフラグし、ページを取り下げます (解放します)
chunks
内のページを削除します (チャンクサイズはinnodb_buffer_pool_chunk_size
によって定義されます)ハッシュテーブル、リストおよびポインタをメモリー内の新しいアドレスを使用するように変換
これらの操作のうち、バッファプールをデフラグしてページを取り下げるだけで、他のスレッドがバッファプールに同時にアクセスできます。