二重書込みバッファは、InnoDB
データファイル内の適切な位置にページを書き込む前に、バッファプールからフラッシュされたページを InnoDB
が書き込む記憶域です。 ページ書込み中にオペレーティングシステム、ストレージサブシステムまたは予期しない mysqld プロセスが終了した場合、InnoDB
はクラッシュリカバリ中に二重書込みバッファからページの適切なコピーを見つけることができます。
データは 2 回書き込まれますが、二重書込みバッファには I/O オーバーヘッドの 2 倍や I/O 操作の 2 倍は必要ありません。 データは、オペレーティングシステムへの単一の fsync()
コールを使用して、大きいシーケンシャルチャンクで二重書込みバッファに書き込まれます (innodb_flush_method
が O_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_DIRECT
のinnodb_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
.dblwrInnoDB
ページサイズが 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_pages
はinnodb_write_io_threads
値に設定されます。 この変数は高度なパフォーマンスチューニングを目的としています。 デフォルト値は、ほとんどのユーザーに適しています。 -
innodb_doublewrite_batch_size
innodb_doublewrite_batch_size
変数 (MySQL 8.0.20 で導入) は、バッチで書き込む二重書込みページの数を制御します。 この変数は高度なパフォーマンスチューニングを目的としています。 デフォルト値は、ほとんどのユーザーに適しています。
MySQL 8.0.23 では、InnoDB
は暗号化されたテーブルスペースに属する二重書込みファイルページを自動的に暗号化します (セクション15.13「InnoDB 保存データ暗号化」 を参照)。 同様に、ページ圧縮テーブルスペースに属する二重書込みファイルページも圧縮されます。 その結果、二重書込みファイルには、暗号化されていないページと圧縮されていないページ、暗号化されたページ、圧縮されたページ、暗号化と圧縮の両方を含む様々なページタイプを含めることができます。