MySQL 8.0 リファレンスマニュアル


15.8.3.6 バッファープールの状態の保存と復元

サーバーの再起動後の warmup 期間を短縮するために、InnoDB では、サーバーの停止時にバッファプールごとに最近使用されたページの割合が保存され、サーバーの起動時にこれらのページがリストアされます。 最近使用されたページのうち、格納されたページの割合は、innodb_buffer_pool_dump_pct 構成オプションによって定義されます。

ビジー状態のサーバーを再起動した後、バッファプール内にあったディスクページがメモリーに戻されるため (同じデータがクエリー、更新などされるため)、通常はスループットが急激に向上するウォームアップ期間があります。 起動時にバッファプールをリストアする機能により、DML 操作が対応する行にアクセスするのを待機するのではなく、再起動前にバッファプールにあったディスクページをリロードすることでウォームアップ期間が短縮されます。 また、I/O リクエストは大規模なバッチで実行できるため、I/O 全体が高速になります。 ページのロードはバックグラウンドで行われ、データベースの起動は遅延しません。

停止時にバッファプールの状態を保存して起動時にリストアする以外に、サーバーの実行中にいつでもバッファプールの状態を保存およびリストアできます。 たとえば、安定したスループットに達した後、安定したワークロードでバッファプールの状態を保存できます。 また、レポートまたはメンテナンスジョブを実行した後、これらの操作のみに必要なデータページをバッファプールに移動した後、またはその他の非標準ワークロードを実行した後に、以前のバッファプールの状態をリストアすることもできます。

バッファプールのサイズは GB ですが、InnoDB がディスクに保存するバッファプールデータは比較によって小さいです。 該当するページを見つけるために必要なテーブルスペース ID とページ ID だけがディスクに保存されます。 この情報は、INNODB_BUFFER_PAGE_LRU INFORMATION_SCHEMA テーブルから取得されます。 デフォルトでは、テーブルスペース ID とページ ID のデータは、InnoDB データディレクトリに保存される ib_buffer_pool という名前のファイル内に保存されます。 ファイル名と場所は、innodb_buffer_pool_filename 構成パラメータを使用して変更できます。

データは通常のデータベース操作と同様にキャッシュされ、バッファプールからエージアウトされるため、ディスクページが最近更新された場合や、ロードされていないデータが DML 操作に含まれている場合は、問題はありません。 ロードメカニズムは、すでに存在しないリクエストされたページをスキップします。

ベースとなるメカニズムには、ダンプおよびロード操作を実行するためにディスパッチされるバックグラウンドスレッドが含まれています。

圧縮テーブルからのディスクページは、その圧縮された形式でバッファープールにロードされます。 DML 操作中にページコンテンツにアクセスすると、ページは通常どおりに圧縮解除されます。 ページの圧縮解除は CPU を大量に消費するプロセスであるため、バッファプールのリストア操作を実行する単一のスレッドではなく、接続スレッドで操作を実行すると同時実行性が向上します。

バッファープールの状態の保存と復元に関連する操作については、次のトピックで説明します:

バッファープールページのダンプ率の構成

バッファープールからページをダンプする前に、innodb_buffer_pool_dump_pct オプションを設定することによって、ダンプする最後に使用されたバッファープールページの割合を構成できます。 サーバーの実行中にバッファープールページをダンプする場合は、このオプションを動的に構成できます:

SET GLOBAL innodb_buffer_pool_dump_pct=40;

サーバーの停止時にバッファープールページをダンプする場合は、構成ファイルで innodb_buffer_pool_dump_pct を設定します。

[mysqld]
innodb_buffer_pool_dump_pct=40

innodb_buffer_pool_dump_pct のデフォルト値は 25 です (最近使用されたページの 25% をダンプします)。

シャットダウン時のバッファープールの状態の保存と起動時の復元

サーバーの停止時にバッファプールの状態を保存するには、サーバーを停止する前に次のステートメントを発行します:

SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;

innodb_buffer_pool_dump_at_shutdown はデフォルトで有効になっています。

サーバーの起動時にバッファープールの状態を復元するには、サーバーの起動時に --innodb-buffer-pool-load-at-startup オプションを指定します:

mysqld --innodb-buffer-pool-load-at-startup=ON;

innodb_buffer_pool_load_at_startup はデフォルトで有効になっています。

バッファープールの状態をオンラインで保存および復元

MySQL サーバーの実行中にバッファープールの状態を保存するには、次のステートメントを発行します:

SET GLOBAL innodb_buffer_pool_dump_now=ON;

MySQL の実行中にバッファープールの状態を復元するには、次のステートメントを発行します:

SET GLOBAL innodb_buffer_pool_load_now=ON;
バッファープールのダンプの進行状況の表示

バッファープールの状態をディスクに保存するときの進行状況を表示するには、次のステートメントを発行します:

SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

操作がまだ開始されていない場合は、not started が返されます。 操作が完了している場合は、完了時間が出力されます (たとえば、Finished at 110505 12:18:02)。 操作が進行中である場合は、ステータス情報が表示されます (たとえば、Dumping buffer pool 5/7, page 237/2873)。

バッファープールのロードの進行状況の表示

バッファープールのロード時に進行状況を表示するには、次のステートメントを発行します:

SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

操作がまだ開始されていない場合は、not started が返されます。 操作が完了している場合は、完了時間が出力されます (たとえば、Finished at 110505 12:23:24)。 操作が進行中である場合は、ステータス情報が表示されます (たとえば、Loaded 123/22301 pages)。

バッファープールのロード操作の中止

バッファープールのロード操作を中止するには、次のステートメントを発行します:

SET GLOBAL innodb_buffer_pool_load_abort=ON;
パフォーマンススキーマを使用したバッファプールのロード進行状況の監視

Performance Schema を使用して、バッファープールのロードの進行状況をモニターできます。

次の例は、stage/innodb/buffer pool load ステージイベントインストゥルメントおよび関連するコンシューマテーブルを有効にして、バッファプールのロード進行状況を監視する方法を示しています。

この例で使用されるバッファープールのダンプおよびロード手順については、セクション15.8.3.6「バッファープールの状態の保存と復元」 を参照してください。 パフォーマンススキーマステージイベントインストゥルメントおよび関連コンシューマについては、セクション27.12.5「パフォーマンススキーマステージイベントテーブル」 を参照してください。

  1. stage/innodb/buffer pool load インストゥルメントを有効にします:

    mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' 
           WHERE NAME LIKE 'stage/innodb/buffer%';
  2. ステージイベントコンシューマテーブル (events_stages_currentevents_stages_history および events_stages_history_long を含む) を有効にします。

    mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' 
           WHERE NAME LIKE '%stages%';
  3. innodb_buffer_pool_dump_now を有効にして、現在のバッファープールの状態をダンプします。

    mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
  4. バッファープールダンプステータスをチェックして、操作が完了したことを確認します。

    mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status'\G
    *************************** 1. row ***************************
    Variable_name: Innodb_buffer_pool_dump_status
            Value: Buffer pool(s) dump completed at 150202 16:38:58
  5. innodb_buffer_pool_load_now を有効にしてバッファプールをロードします:

    mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
  6. パフォーマンススキーマ events_stages_current テーブルをクエリーして、バッファープールのロード操作の現在のステータスを確認します。 WORK_COMPLETED カラムには、ロードされたバッファプールページの数が表示されます。 WORK_ESTIMATED カラムには、残りの作業の推定がページ単位で表示されます。

    mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
           FROM performance_schema.events_stages_current;
    +-------------------------------+----------------+----------------+
    | EVENT_NAME                    | WORK_COMPLETED | WORK_ESTIMATED |
    +-------------------------------+----------------+----------------+
    | stage/innodb/buffer pool load |           5353 |           7167 |
    +-------------------------------+----------------+----------------+

    バッファプールのロード操作が完了すると、events_stages_current テーブルは空のセットを返します。 この場合、events_stages_history テーブルをチェックして、完了したイベントのデータを表示できます。 例:

    mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED 
           FROM performance_schema.events_stages_history;
    +-------------------------------+----------------+----------------+
    | EVENT_NAME                    | WORK_COMPLETED | WORK_ESTIMATED |
    +-------------------------------+----------------+----------------+
    | stage/innodb/buffer pool load |           7167 |           7167 |
    +-------------------------------+----------------+----------------+
注記

innodb_buffer_pool_load_at_startup を使用して起動時にバッファープールをロードするときに、パフォーマンススキーマを使用してバッファープールのロードの進行状況をモニターすることもできます。 この場合、起動時に stage/innodb/buffer pool load インストゥルメントおよび関連コンシューマを有効にする必要があります。 詳細については、セクション27.3「パフォーマンススキーマ起動構成」を参照してください。


関連キーワード:  InnoDB, プール, テーブル, buffer, pool, 構成, 操作, ページ, ロード, バッファ