MySQL 8.0.22 では、InnoDB
が Linux の file-per-table および general テーブルスペースに領域を割り当てる方法を最適化できます。 デフォルトでは、追加の領域が必要な場合、InnoDB
はテーブルスペースにページを割り当て、それらのページに NULL を物理的に書き込みます。 新しいページが頻繁に割り当てられる場合、この動作はパフォーマンスに影響を与える可能性があります。 MySQL 8.0.22 では、Linux システムで innodb_extend_and_initialize
を無効にして、新しく割り当てられたテーブルスペースページに NULL が物理的に書き込まれないようにできます。 innodb_extend_and_initialize
を無効にすると、posix_fallocate()
コールを使用してテーブルスペースファイルに領域が割り当てられ、物理的に NULL を書き込まずに領域が予約されます。
posix_fallocate()
操作はアトミックではないため、テーブルスペースファイルへの領域の割当てとファイルメタデータの更新の間に障害が発生する可能性があります。 このような障害が発生すると、新しく割り当てられたページは初期化されていない状態のままになり、InnoDB
がこれらのページにアクセスしようとしたときに障害が発生する可能性があります。 このシナリオを回避するために、InnoDB
は新しいテーブルスペースページを割り当てる前に redo ログレコードを書き込みます。 ページ割当て操作が中断されると、リカバリ中に redo ログレコードから操作がリプレイされます。 (redo ログレコードからリプレイされたページ割当て操作は、新しく割り当てられたページに NULL を物理的に書き込みます。) redo ログレコードは、innodb_extend_and_initialize
の設定に関係なく、ページを割り当てる前に書き込まれます。
Linux 以外のシステムおよび Windows では、InnoDB
はテーブルスペースに新しいページを割り当て、それらのページに NULL を物理的に書き込みます (デフォルトの動作)。 これらのシステムで innodb_extend_and_initialize
を無効にしようとすると、次のエラーが返されます:
Changing innodb_extend_and_initialize はこのプラットフォームではサポートされていません。 default. へのフォールバック
MySQL 8.0.23 で導入された AUTOEXTEND_SIZE
オプションは、posix_fallocate()
コールによって割り当てられる領域の量を定義します。 領域を大量に割り当てると、断片化の回避に役立ち、大量のデータの収集が容易になります。 詳細は、セクション15.6.3.9「テーブルスペースの AUTOEXTEND_SIZE 構成」を参照してください。