Undo log는 단일 트랜잭션과 관련된 Undo log 레코드의 집합입니다.
undo log 레코드에는 클러스터드 인덱스 레코드의 트랜잭션에 의한 제일 최근의 변경사항의 변경 전 데이터에 대한 정보를 포함하고 있습니다.
만약 다른 트랜잭션이 변경 전 데이터를 읽기를 원한다면 undo log 레코드에서 변경 전 데이터를 읽습니다.
롤백 세그먼트내에 포함된 undo log 세그먼트 내에 undo log가 존재합니다. 롤백 세그먼트는 undo 테이블스페이스와 global temporary 테이블스페이스 내에 있습니다.
global temporary 테이블스페이스 내에 있는 undo log는 사용자 정의 임시 테이블의 데이터를 수정하는 트랜잭션에 사용됩니다. 이러한 unodo log는 crash recovery에 필요하지 않으므로 리두 로깅(redo-logged) 되지 않습니다.
global temporary 테이블스페이스 내에 있는 undo log는 서버가 운영중일때에 rollback을 위해서만 오직 사용됩니다.
이러한 타입의 undo log는 리두 로깅 I/O를 피할 수 있어서 성능상의 이점이 있습니다.
각 Undo 테이블스페이스와 global temporary 테이블스페이스는 최대 128개의 롤백 세그먼트를 가질 수 있습니다.
innodb_rollback_segments 파라미터로 롤백 세그먼트의 수를 정의합니다.
mysql> show variables like 'innodb_rollback_segments';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_rollback_segments | 128 |
+--------------------------+-------+
1 row in set (0.00 sec)
롤백 세그먼트가 지원하는 트랜잭션의 수는 롤백 세그먼트 내의 undo slot의 수와 각 트랜잭션에 필요한 undo log의 수에 따라 다릅니다.
InnoDB Page Size | 롤백세그먼트의 undo slot 수(innodb page size/16) |
4096 (4KB) | 256 |
8192 (8KB) | 512 |
16384 (16KB) | 1024 |
32768 (32KB) | 2048 |
65536 (64KB) | 4096 |
트랜잭션에는 아래의 각 작업당 하나씩 최대 4개까지의 undo log가 할당됩니다.
1. 사용자 정의 테이블의 INSERT 작업
2. 사용자 정의 테이블의 UPDATE와 DELETE 작업
3. 사용자 정의 임시 테이블의 INSERT 작업
4. 사용자 정의 임시 테이블의 UPDATE와 DELETE 작업
Undo log는 필요에 따라 할당됩니다. 예를 들어 INSERT,UPDATE,DELETE 작업을 테이블과 임시테이블에서 작업하는 트랜잭션은 undo log가 최대인 4개가 할당됩니다.
오직 테이블에 INSERT 작업만 있는 트랜잭션은 한개의 undo log가 할당됩니다.
일반 테이블에서 수행하는 트랜잭션은 UNDO 테이블스페이스 롤백 세그먼트의 undo log가 할당됩니다.
임시 테이블에서 수행하는 트랜잭션은 global temporary 테이블스페이스 롤백 세그먼트의 undo log가 할당됩니다.
트랜잭션 수행시 할당된 undo log는 그 기간동안은 트랜잭션에 연결된 상태로 유지됩니다.
예를 들어 일반 테이블의 INSERT작업을 하는 트랜잭션에 할당된 undo log는 그 트랜잭션에 의해 수행되는 모든 INSERT작업에서 사용됩니다.
'다른 DBMS > MySQL&MariaDB' 카테고리의 다른 글
select ...into OUTFILE을 이용한 백업&복구 (0) | 2021.01.30 |
---|---|
InnoDB Locking (0) | 2021.01.18 |
InnoDB Redo Log (0) | 2021.01.15 |
InnoDB Doublewrite Buffer (0) | 2021.01.14 |
InnoDB On-Disk Structures (0) | 2021.01.13 |
댓글