PolarDB for MySQL のプライマリノードが再起動すると、InnoDB バッファープールは空の状態から開始されます。データベースは必要に応じてストレージからページを再読み込みするため、バッファープールが再構成されるまでの間、パフォーマンスが低下します。この再構成には、大量の書き込みワークロードまたは大規模トランザクションを処理する場合、数分かかることがあります。ウォームバッファプールは、バッファープールをデータベースプロセスとは独立した Linux 共有メモリ上に保存することで、この「コールドスタート」期間を解消します。バッファープールは再起動をまたいで保持され、ノードが復帰した直後に即座に利用可能になります。
前提条件
ウォームバッファプールを有効化する前に、以下の点を確認してください。
PolarDB クラスターが MySQL 8.0.2(リビジョンバージョン 8.0.2.1.0 以降)で実行されていること。バージョンの確認方法については、「エンジンバージョン」の「エンジンバージョンの照会」セクションをご参照ください。
テーブル圧縮機能が無効化されていること。
仕組み
ウォームバッファプールは、InnoDB バッファープールをプロセスメモリではなく Linux 共有メモリ上に保存します。バッファープールが PolarDB プロセスから独立しているため、再起動後も存続します。

主な動作特性は以下のとおりです。
再起動をまたいだ永続性: バッファープールの制御データ、ページメタデータ、およびページデータが共有メモリ上に保存されます。PolarDB 起動時に、新規のバッファープールを割り当てる代わりに、既存の共有メモリ上のバッファープールにアタッチします。
クラッシュ回復: ノードがクラッシュした場合、PolarDB は共有メモリ上のバッファープールに不整合がないかを検出し、アタッチ前に修復を行います。
高速なクリーンシャットダウン: 手動による再起動では、PolarDB がシャットダウン前に主要なトランザクション状態を保存します。これにより、シャットダウン時のロールバックおよび起動時の状態復元が不要となり、再起動時間を大幅に短縮できます。
O&M 操作:
mysqlshmツールを使用すると、コマンドラインから構成情報を照会したり、共有メモリ上のバッファープールを解放したりできます。
メリット
高速な再起動
ウォームバッファプールにより、プライマリノードの再起動時間が数分から数秒へと短縮されます。特に、プライマリノードのバッファープールが大規模であり、大量の書き込みワークロードや大規模トランザクションを処理する場合に、その効果が顕著です。
再起動後の安定したパフォーマンス
バッファープールが共有メモリ上に保持されるため、再起動後も直近にアクセスされたページが引き続き利用可能です。ウォームアップ期間が不要であり、パフォーマンス低下も発生しません。
以下の図は、Sysbench OLTP 読み取り専用ワークロードを用いて、50 GB のバッファープールで再起動中のスループットを示しています。

ウォームバッファプール未使用時(オレンジ線):再起動直後にスループットが通常時の 2 % まで低下し、約 200 秒かけて回復します。
ウォームバッファプール使用時(青線):再起動中もスループットに影響はありません。
ウォームバッファプールの有効化
手動再起動の場合
innodb_buf_shm_keyをmy.cnfで 0 以外の値に設定し、PolarDB クラスターを起動します。機能が有効であることを確認します。
SHOW GLOBAL STATUS LIKE 'innodb_shared_buffer_pool_status';返される値は
Allocate from shared memoryである必要があります。innodb_fast_shutdownを3に設定します。SET GLOBAL innodb_fast_shutdown = 3;プライマリノードを再起動します。
再起動後に、再度ステータスを確認します。
SHOW GLOBAL STATUS LIKE 'innodb_shared_buffer_pool_status';返される値は
Attach to clean shutdown shared memoryである必要があります。これは、ノードが正常にシャットダウンされたバッファープールにアタッチしたことを意味します。
例外発生による再起動の場合
innodb_buf_shm_keyをmy.cnfで 0 以外の値に設定し、PolarDB クラスターを起動します。機能が有効であることを確認します。
SHOW GLOBAL STATUS LIKE 'innodb_shared_buffer_pool_status';返される値は
Allocate from shared memoryである必要があります。mysqld プロセスを終了して、ノードのクラッシュをシミュレートします。
ノードが再起動するまで待ちます。
再起動後に、再度ステータスを確認します。
SHOW GLOBAL STATUS LIKE 'innodb_shared_buffer_pool_status';返される値は
Attach to abnormal shutdown shared memoryである必要があります。これは、PolarDB がクラッシュ状態からの共有メモリ上のバッファープールを検出し、回復したことを意味します。
参考情報
パラメーター
| パラメーター | 型 | レベル | 説明 |
|---|---|---|---|
innodb_buf_shm_key | 整数 | グローバル | 共有メモリ上のバッファープールの固有識別子です。ウォームバッファプールを有効化するには、0 以外の値を指定します。有効値:0 ~ 2^64−1。デフォルト値:0(無効)。 |
innodb_buf_shm_base_addr | 整数 | グローバル | 共有バッファープールの仮想メモリアドレスのベースオフセットです。有効値:0x300000000000 ~ 2^64−1。デフォルト値:0x567800000000。 |
innodb_buf_page_desc_free_list_size | 整数 | グローバル | 圧縮ページ記述子のために予約されるページ数です。有効値:8 ~ 128。デフォルト値:16。 |
innodb_buf_free_zip_pages | 整数 | グローバル | 再起動時の圧縮ページの処理方法です。有効値:1(例外による再起動時に圧縮ページを解放)、2(再起動中に圧縮ページを強制的に解放)。デフォルト値:1。 |
innodb_buffer_pool_parallel_scan_threads | 整数 | グローバル | 並列バッファープールスキャンに使用するスレッド数です。有効値:0 ~ 512。デフォルト値:4。 |
innodb_buf_shm_huge_page | ブール値 | グローバル | 共有メモリの割り当て時にラージページを使用するかどうかを指定します。有効値:ON、OFF。デフォルト値:ON。 |
innodb_fast_shutdown | 整数 | グローバル | InnoDB のシャットダウンモードです。有効値:0、1、2、3。3 は PolarDB 固有の値で、2 と同じ動作ですが、未コミットトランザクションのロールバックを行いません。デフォルト値:1。 |
ステータス値
ウォームバッファプールの現在の状態を照会します。
SHOW GLOBAL STATUS LIKE 'innodb_shared_buffer_pool_status';| 値 | 意味 |
|---|---|
Using process private memory | ウォームバッファプールは無効です。ノードは標準のプロセスプライベートメモリを使用します。 |
Allocate from shared memory | ウォームバッファプールは有効です。バッファープールは共有メモリ上に割り当てられます。 |
Attach to clean shutdown shared memory | ノードは正常にシャットダウンされたバッファープールにアタッチしました。完全な再起動高速化が適用されます。 |
Attach to abnormal shutdown shared memory | ノードはクラッシュを経ても存続したバッファープールにアタッチしました。PolarDB が不整合を検出し、修復済みです。 |
mysqlshm
mysqlshm は、共有メモリ上のバッファープールを管理するコマンドラインツールです。データベースの再起動なしに、バッファープールの状態を確認したり、解放したりできます。
Usage: mysqlshm -k key [options]
-h, このヘルプを表示して終了します。
-k, 共有メモリのキー [必須]
-i, 共有メモリの基本情報を表示します。
-f, 共有メモリを解放します。