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 ログが割り当てられます:
ユーザー定義テーブルに対する
INSERT
操作ユーザー定義テーブルに対する
UPDATE
およびDELETE
操作ユーザー定義一時テーブルに対する
INSERT
操作ユーザー定義一時テーブルに対する
UPDATE
およびDELETE
操作
undo ログは必要に応じて割り当てられます。 たとえば、通常のテーブルおよび一時テーブルに対して INSERT
、UPDATE
および DELETE
操作を実行するトランザクションには、4 つの undo ログの完全な割当てが必要です。 通常のテーブルに対して INSERT
操作のみを実行するトランザクションには、単一の undo ログが必要です。
通常のテーブルに対して操作を実行するトランザクションには、割り当てられた undo テーブルスペースロールバックセグメントから undo ログが割り当てられます。 一時テーブルに対して操作を実行するトランザクションには、割り当てられたグローバル一時テーブルスペースロールバックセグメントから undo ログが割り当てられます。
トランザクションに割り当てられた undo ログは、その期間中トランザクションに関連付けられたままになります。 たとえば、通常のテーブルに対する INSERT
操作のトランザクションに割り当てられた undo ログは、そのトランザクションによって実行される通常のテーブルに対するすべての INSERT
操作に使用されます。
前述の要因に基づき、次の式を使用して、InnoDB
がサポートできる同時読取り/書込みトランザクションの数を見積もることができます。
InnoDB
がサポートできる同時読取り/書込みトランザクションの数に達する前に、トランザクションで同時トランザクション制限エラーが発生する場合があります。 これは、トランザクションに割り当てられたロールバックセグメントで undo スロットが不足した場合に発生します。 このような場合は、トランザクションを再実行してください。
トランザクションが一時テーブルに対して操作を実行する場合、InnoDB
がサポートできる同時読取り/書込みトランザクションの数は、グローバル一時テーブルスペース (デフォルトで 128) に割り当てられたロールバックセグメントの数によって制約されます。
-
各トランザクションが
INSERT
、UPDATE
または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