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


15.6.4 二重書き込みバッファー

二重書込みバッファは、InnoDB データファイル内の適切な位置にページを書き込む前に、バッファプールからフラッシュされたページを InnoDB が書き込む記憶域です。 ページ書込み中にオペレーティングシステム、ストレージサブシステムまたは予期しない mysqld プロセスが終了した場合、InnoDB はクラッシュリカバリ中に二重書込みバッファからページの適切なコピーを見つけることができます。

データは 2 回書き込まれますが、二重書込みバッファには I/O オーバーヘッドの 2 倍や I/O 操作の 2 倍は必要ありません。 データは、オペレーティングシステムへの単一の fsync() コールを使用して、大きいシーケンシャルチャンクで二重書込みバッファに書き込まれます (innodb_flush_methodO_DIRECT_NO_FSYNC に設定されている場合を除く)。

MySQL 8.0.20 より前は、二重書込みバッファ記憶域は InnoDB システムテーブルスペースにありました。 MySQL 8.0.20 では、二重書込みバッファ記憶域は二重書込みファイルにあります。

二重書込みバッファ構成には、次の変数が用意されています:

  • innodb_doublewrite

    innodb_doublewrite 変数は、二重書込みバッファを有効にするかどうかを制御します。 ほとんどの場合、デフォルトで有効になっています。 二重書込みバッファを無効にするには、innodb_doublewrite を 0 に設定するか、--skip-innodb-doublewrite でサーバーを起動します。 たとえば、ベンチマークの実行時などのように、データ整合性よりもパフォーマンスに関心がある場合は、二重書込みバッファを無効にすることを検討してください。

    二重書き込みバッファーがアトミック書き込みをサポートする Fusion-io デバイス上にある場合、二重書き込みバッファーは自動的に無効になり、代わりに Fusion-io アトミック書き込みを使用してデータファイル書き込みが実行されます。 ただし、innodb_doublewrite 設定はグローバルであることに注意してください。 二重書き込みバッファーが無効になっている場合、Fusion-io ハードウェア上に存在しないデータファイルを含むすべてのデータファイルに対して無効になります。 この機能は Fusion-io ハードウェアでのみサポートされ、Linux の Fusion-io NVMFS でのみ有効になります。 この機能を最大限に活用するには、O_DIRECTinnodb_flush_method 設定をお薦めします。

  • innodb_doublewrite_dir

    innodb_doublewrite_dir 変数 (MySQL 8.0.20 で導入) は、InnoDB が二重書込みファイルを作成するディレクトリを定義します。 ディレクトリが指定されていない場合、二重書込みファイルが innodb_data_home_dir ディレクトリに作成され、指定されていない場合はデータディレクトリにデフォルト設定されます。

    スキーマ名との競合を避けるために、指定されたディレクトリ名の前にハッシュ記号'#'が自動的に付加されます。 ただし、ディレクトリ名に'.'、'#'、または'/'接頭辞が明示的に指定されている場合、ディレクトリ名の前にハッシュ記号'#'は付けられません。

    二重書込みディレクトリは、使用可能な最も高速なストレージメディアに配置することが理想的です。

  • innodb_doublewrite_files

    innodb_doublewrite_files 変数は、二重書込みファイルの数を定義します。 デフォルトでは、バッファプールインスタンスごとに 2 つの二重書込みファイルが作成されます: フラッシュリスト二重書込みファイルおよび LRU リスト二重書込みファイル。

    フラッシュリスト二重書き込みファイルは、バッファープールのフラッシュリストからフラッシュされたページ用です。 フラッシュリストの二重書込みファイルのデフォルトサイズは、InnoDB ページサイズ * 二重書込みページバイトです。

    LRU リストの二重書込みファイルは、バッファプール LRU リストからフラッシュされたページ用です。 また、単一ページフラッシュ用のスロットも含まれます。 LRU リスト二重書込みファイルのデフォルトサイズは、InnoDB ページサイズ * (二重書込みページ + (512 / バッファプールインスタンスの数)) です。512 は、単一ページフラッシュ用に予約されたスロットの合計数です。

    少なくとも 2 つの二重書込みファイルがあります。 二重書込みファイルの最大数は、バッファプールインスタンスの 2 倍です。 (バッファープールインスタンスの数は、innodb_buffer_pool_instances 変数によって制御されます。)

    二重書込みファイル名の形式は次のとおりです: #ib_page_size_file_number.dblwr。 たとえば、次の二重書込みファイルは、InnoDB ページサイズが 16KB で単一のバッファプールの MySQL インスタンスに対して作成されます:

    #ib_16384_0.dblwr
    #ib_16384_1.dblwr

    innodb_doublewrite_files 変数は、高度なパフォーマンスチューニングを目的としています。 デフォルト設定は、ほとんどのユーザーに適しています。

  • innodb_doublewrite_pages

    innodb_doublewrite_pages 変数 (MySQL 8.0.20 で導入) は、スレッド当たりの二重書込みページの最大数を制御します。 値が指定されていない場合、innodb_doublewrite_pagesinnodb_write_io_threads 値に設定されます。 この変数は高度なパフォーマンスチューニングを目的としています。 デフォルト値は、ほとんどのユーザーに適しています。

  • innodb_doublewrite_batch_size

    innodb_doublewrite_batch_size 変数 (MySQL 8.0.20 で導入) は、バッチで書き込む二重書込みページの数を制御します。 この変数は高度なパフォーマンスチューニングを目的としています。 デフォルト値は、ほとんどのユーザーに適しています。

MySQL 8.0.23 では、InnoDB は暗号化されたテーブルスペースに属する二重書込みファイルページを自動的に暗号化します (セクション15.13「InnoDB 保存データ暗号化」 を参照)。 同様に、ページ圧縮テーブルスペースに属する二重書込みファイルページも圧縮されます。 その結果、二重書込みファイルには、暗号化されていないページと圧縮されていないページ、暗号化されたページ、圧縮されたページ、暗号化と圧縮の両方を含む様々なページタイプを含めることができます。


関連キーワード:  InnoDB, テーブル, 書込み, ページ, 構成, 圧縮, バッファ, 書き込み, スペース, ロック