언두로그

트랜잭션과 격리 수준을 보장하기 위해 DML로 데이터가 변경되기 이전의 데이터를 보관하는 영역

언두로그의 사용처는 크게 두가지로, 트랜잭션의 롤백 대비용인 경우와 격리수준을 유지하면서 높은 동시성을 제공하기 위함이다.

트랜잭션 - 롤백되었으면 언두로그에 저장해둔 데이터로 백업한다.

격리수준 - 커넥션 진행 중 다른 커넥션이 데이터 조회하면 격리 수준에 맞게 변경 중인 데이터를 읽게하거나 언두로그를 읽음으로써 처리한다.

pg.123

3개의 트랜잭션이 일어난 상황에서 언두로그가 삭제되는 시점에 대한 내용이 있다. 트랜잭션이 사라지는 경우에 대해서 얘기하고 있는데, 트랜잭션이 무수히 많이 일어나는 환경이라면, 트랜잭션의 데이터들이 사라지지 않고 계속 쌓일수밖에 없는건가?

언두로그가 계속 쌓이는 상황에서 문제가 발생할 수 있는 부분으로, 데이터가 계속 변경된다면 언두 로그의 이력을 필요한 만큼 스캔해야만 필요한 레코드를 찾을 수 있기 때문에 쿼리의 성능이 저하될 수 있다고 한다.

쿼리가 어떻게 실행되는 것이기에 이 언두로그의 이력들을 모두 스캔하는 것일까?

언두로그를 돌아가면서 순차적으로 사용해 디스크 공간을 줄이는 것이 가능하다?

언두로그가 늘어날때마다 디스크에 있는 공간에 저장하는 건가?

언두로그에 대한 데이터가 시스템 테이블스페이스에 저장되다가 MySQL 실행때마다 언두로그에 대해서는 새로 생성해야해서 언두로그 파일에 별도로 저장하는 방식으로 변경되었다.

언두 테이블스페이스는 1~128개의 롤백 세그먼트를 가지며, 롤백 세그먼트는 1개 이상의 언두 슬롯을 가진다.