特に、大きなInnoDB
バッファープールを持つインスタンスの場合は、サーバーを再起動したあとの非常に長いウォームアップ期間を回避するために、サーバーのシャットダウン時に InnoDB
バッファープールの状態を保存し、サーバーの起動時にバッファープールを同じ状態にリストアすることができます。
ビジー状態のサーバーを再起動したあと、通常は、InnoDB
バッファープール内にあったディスクページがメモリーに戻されるにつれ (同じデータへのクエリーや更新などが実行されるにつれ)、スループットが着実に向上するウォームアップ期間が存在します。バッファープールをシャットダウン前の状態にリストアする機能により、DML 操作での対応する行へのアクセスを待つのではなく、再起動前にバッファープール内にあったディスクページをただちにリロードできるため、ウォームアップ期間が短くなります。I/O 要求を大きなバッチで実行できるため、I/O 全体がより高速になります。ページのロードはバックグラウンドで実行されるため、データベースの起動が遅れることはありません。
バッファープールの状態をシャットダウン時に保存し、起動時にリストアすることに加え、サーバーの実行中にも、バッファープールの状態をいつでも保存およびリストアすることができます。たとえば、定常状態のワークロードの下で安定したスループットに達したあとに、バッファープールの状態を保存できます。その操作の期間中にのみ必要なデータページをバッファープールに移動するレポートまたは保守ジョブを実行したあとや、標準的でないワークロードを使用したその他の一定期間のあとに、バッファープールの以前の状態をリストアできます。
バッファープール自体のサイズは何 G バイトもある可能性がありますが、InnoDB
がディスク上に保存するデータはそれに比べて非常に少量です。該当するページを見つけるために必要なテーブルスペース ID とページ ID だけがディスクに保存されます。この情報は、INNODB_BUFFER_PAGE_LRU
INFORMATION_SCHEMA
テーブルから取得されます。デフォルトでは、テーブルスペース ID とページ ID のデータは、InnoDB
データディレクトリに保存される ib_buffer_pool
という名前のファイル内に保存されます。このファイル名は、innodb_buffer_pool_filename
構成パラメータを使用して変更できます。
ベースとなるメカニズムには、ダンプおよびロード操作を実行するためにディスパッチされるバックグラウンドスレッドが含まれています。
圧縮テーブルからのディスクページは、その圧縮された形式でバッファープールにロードされます。DML 操作の過程でページの内容がアクセスされると、圧縮解除が通常どおりに実行されます。圧縮解除は CPU を大量に消費するプロセスであるため、並列性としては、バッファープールのリストア操作を実行する単一スレッドではなく、接続スレッドのいずれかで操作を実行する方が効率的です。
デフォルトでは、バッファープールの状態は、InnoDB
データディレクトリに保存される ib_buffer_pool
という名前のファイル内に保存されます。このファイル名は、innodb_buffer_pool_filename
構成パラメータを使用して変更できます。
バッファープールの状態の保存
サーバーのシャットダウン時に InnoDB
バッファープールの状態を保存するには、次のステートメントを発行します。
SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;
MySQL サーバーの実行中に InnoDB
バッファープールの状態を保存するには、次のステートメントを発行します。
SET GLOBAL innodb_buffer_pool_dump_now=ON;
バッファープールの状態のリストア
サーバーの起動時に InnoDB
バッファープールの状態をリストアするには、サーバーを起動するときに --innodb_buffer_pool_load_at_startup
オプションを指定します。
mysqld --innodb_buffer_pool_load_at_startup=ON;
MySQL の実行中に InnoDB
バッファープールの状態をリストアするには、次のステートメントを発行します。
SET GLOBAL innodb_buffer_pool_load_now=ON;
バッファープールのダンプの進行状況の表示
InnoDB
バッファープールの状態をディスクに保存しているときに進行状況を表示するには、次のいずれかのオプションを使用します。
SHOW STATUS LIKE 'innodb_buffer_pool_dump_status';
または
SELECT variable_value FROM information_schema.global_status WHERE
variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS';
操作がまだ開始されていない場合は、「not started」 が返されます。操作が完了している場合は、完了時間が出力されます (たとえば、Finished at 110505 12:18:02)。操作が進行中である場合は、ステータス情報が表示されます (たとえば、Dumping buffer pool 5/7, page 237/2873)。
バッファープールのロードの進行状況の表示
InnoDB
バッファープールをロードしているときに進行状況を表示するには、次のいずれかのオプションを使用します。
SHOW STATUS LIKE 'innodb_buffer_pool_load_status';
または
SELECT variable_value FROM information_schema.global_status WHERE
variable_name = 'INNODB_BUFFER_POOL_LOAD_STATUS';
操作がまだ開始されていない場合は、「not started」 が返されます。操作が完了している場合は、完了時間が出力されます (たとえば、Finished at 110505 12:23:24)。操作が進行中である場合は、ステータス情報が表示されます (たとえば、Loaded 123/22301 pages)。
バッファープールのロードの中止
バッファープールのロード操作を中止するには、次のステートメントを発行します。
SET innodb_buffer_pool_load_abort=ON;