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


15.6.6 undo ログ

undo ログは、単一の読取り/書込みトランザクションに関連付けられた undo ログレコードの集合です。 undo ログレコードには、トランザクションによる clustered index レコードへの最新の変更を元に戻す方法に関する情報が含まれます。 別のトランザクションで読取り一貫性操作の一部として元のデータを参照する必要がある場合、未変更のデータは undo ログレコードから取得されます。 undo ログは、rollback segments 内に含まれる undo log segments 内に存在します。 ロールバックセグメントは、undo tablespaces および global temporary tablespace にあります。

グローバル一時テーブルスペースに存在する undo ログは、ユーザー定義一時テーブルのデータを変更するトランザクションに使用されます。 これらの undo ログは、クラッシュリカバリに必要ないため、redo ログには記録されません。 これらは、サーバーの実行中のロールバックにのみ使用されます。 このタイプの undo ログは、redo ロギング I/O を回避することでパフォーマンスを向上させます。

undo ログの保存データ暗号化の詳細は、undo ログの暗号化 を参照してください。

各 undo テーブルスペースとグローバル一時テーブルスペースは、それぞれ最大 128 個のロールバックセグメントをサポートします。 innodb_rollback_segments 変数は、ロールバックセグメントの数を定義します。

ロールバックセグメントでサポートされるトランザクションの数は、ロールバックセグメント内の undo スロットの数および各トランザクションに必要な undo ログの数によって異なります。

ロールバックセグメントの undo スロットの数は、InnoDB のページサイズによって異なります。

InnoDB ページサイズ ロールバックセグメント内の undo スロット数 (InnoDB ページサイズ / 16)
4096 (4KB) 256
8192 (8KB) 512
16384 (16KB) 1024
32768 (32KB) 2048
65536 (64KB) 4096

トランザクションには、次の操作タイプごとに 1 つずつ、最大 4 つの undo ログが割り当てられます:

  1. ユーザー定義テーブルに対する INSERT 操作

  2. ユーザー定義テーブルに対する UPDATE および DELETE 操作

  3. ユーザー定義一時テーブルに対する INSERT 操作

  4. ユーザー定義一時テーブルに対する UPDATE および DELETE 操作

undo ログは必要に応じて割り当てられます。 たとえば、通常のテーブルおよび一時テーブルに対して INSERTUPDATE および DELETE 操作を実行するトランザクションには、4 つの undo ログの完全な割当てが必要です。 通常のテーブルに対して INSERT 操作のみを実行するトランザクションには、単一の undo ログが必要です。

通常のテーブルに対して操作を実行するトランザクションには、割り当てられた undo テーブルスペースロールバックセグメントから undo ログが割り当てられます。 一時テーブルに対して操作を実行するトランザクションには、割り当てられたグローバル一時テーブルスペースロールバックセグメントから undo ログが割り当てられます。

トランザクションに割り当てられた undo ログは、その期間中トランザクションに関連付けられたままになります。 たとえば、通常のテーブルに対する INSERT 操作のトランザクションに割り当てられた undo ログは、そのトランザクションによって実行される通常のテーブルに対するすべての INSERT 操作に使用されます。

前述の要因に基づき、次の式を使用して、InnoDB がサポートできる同時読取り/書込みトランザクションの数を見積もることができます。

注記

InnoDB がサポートできる同時読取り/書込みトランザクションの数に達する前に、トランザクションで同時トランザクション制限エラーが発生する場合があります。 これは、トランザクションに割り当てられたロールバックセグメントで undo スロットが不足した場合に発生します。 このような場合は、トランザクションを再実行してください。

トランザクションが一時テーブルに対して操作を実行する場合、InnoDB がサポートできる同時読取り/書込みトランザクションの数は、グローバル一時テーブルスペース (デフォルトで 128) に割り当てられたロールバックセグメントの数によって制約されます。

  • 各トランザクションが INSERTUPDATE または DELETE のいずれかの操作を実行する場合、InnoDB がサポートできる同時読取り/書込みトランザクションの数は次のとおりです:

    (innodb_page_size / 16) * innodb_rollback_segments * number of undo tablespaces
  • 各トランザクションが INSERT および UPDATE または DELETE 操作を実行する場合、InnoDB がサポートできる同時読取り/書込みトランザクションの数は次のとおりです:

    (innodb_page_size / 16 / 2) * innodb_rollback_segments * number of undo tablespaces
  • 各トランザクションが一時テーブルに対して INSERT 操作を実行する場合、InnoDB がサポートできる同時読取り/書込みトランザクションの数は次のとおりです:

    (innodb_page_size / 16) * innodb_rollback_segments
  • 各トランザクションが一時テーブルに対して INSERT および UPDATE または DELETE 操作を実行する場合、InnoDB がサポートできる同時読取り/書込みトランザクションの数は次のとおりです:

    (innodb_page_size / 16 / 2) * innodb_rollback_segments

関連キーワード:  InnoDB, テーブル, トランザクション, ログ, 操作, 構成, 実行, スペース, 圧縮, ロック