kiwi

Mysql Redo / Undo Log

by 키위먹고싶다

db

 

 

Transaction을 처리하는 Buffer Pool, Redo Log, Log Buffer를 알아보자

 

Buffer Pool )_ 메모리 영역 

디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간이다. 쓰기 작업을 지연시켜 일괄 작업을 처리 할 수 있게 하는 버퍼인데 INSERT, UPDATE, DELETE처럼 데이터를 변경하는 쿼리는 데이터 파일의 이곳저곳에 위치한 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시킨다. 그러나 버퍼 풀이 이렇게 변경된 데이터를 모아서 처리하면 랜덤한 디스크 작업의 횟수를 줄일 수 있다.  

 

Redo Log

Checkpoint : 트랜잭션의 내용을 buffer pool과 Redo log에 쌓지 않고 Redo Log가 가득 차거나 주기적으로 Buffer pool에 기록된 트랜잭션 내용을 실제 Disk에 반영하는 것. 

 

버퍼 풀은 디스크에서 읽은 상태로 변경되지 않은 클린 페이지와 DML 명령으로 변경된 데이터를 가진 더티 페이지도 가지고 있다. 더티 페이지는 디스크와 상태가 다르기 때문에 언젠가 디스크로 기록돼야 한다. 이때 더티 페이지가 리두 로그가 1개 이상의 고정 크기 파일을 연결해서 순환고리처럼 사용하는데 데이터 변경이 계속 발생하면 리두 로그 파일에 기록됐던 로그 엔트리가 새로운 로그 엔트리로 덮어 쓰이므로, 파일을 두개로 나누어 관리한다.   

 

그림에서 REDO LOG안에 로그 파일이 두개로 분리되어 있는데 그 이유는 재사용 가능한 공간과 당장 재사용 불가능한 공간을 구분해서 관리해야 하기 때문이다.  재사용 불가능한 공간이 활성 리두 로그라고 하며 버퍼 풀과 연결되어 있다. 

 

리두 로그 파일의 공간은 계속 순환되어 재사용되지만 매번 기록될 때마다 로그 포지션은 계속 증가된 값을 갖게 되는데 이를 LSN이라고 한다. 주기적으로 체크포인트를 발생시켜 리두 로그와 버퍼 풀의 더티 페이지를 디스크로 동기화 한다. 

이때 발생한 체크 포인트 중 가장 최큰 체크포인트 지점의 LSN이 활성 리두 로그 공간의 시작점이 된다. 그러나 활성 리두 로그 공간의 마지막은 계속해서 증가하기 때문에 체크포인트와 무관하다. 

 

버퍼 풀의 더티 페이지는 특정 리두 로그 엔트리와 관계를 가지고, 체크포인트가 발생한 LSN보다 작은 리두 로그 엔트리와 관련된 더티 페이지는 모두 디스크로 동기화돼야 한다.  

 

Log Buffer )_ 메모리 영역

트랜잭션을 처리할때마다 Redo Log의 파일에 트랜잭션의 내용을 쓴다면 잦은 Disk의 접근으로 인한 성능 저하가 발생할 수 있는데 이러한 문제를 해결하기 위해 Log Buffer에 트랜잭션의 내용을 기록하고 한꺼번에 Redo Log에 기록한다. flush 될 경우 Redo Log파일에 저장된다. 

 

 

 

실제 DB의 Commit이 발생하면 바로 디스크 영역에 반영되는것이 아니라 메모리 영역(Buffer pool, Log Buffer)에 먼저 들어간다. 항상 Redo Log에 기록되는 것이 아니라 데이터 변경이 있을 경우 기록된다. (select X)

 

 

 

 

MVCC의 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공한다. 이 때 Undo Log라는 것을 이용한다. 

만약 id가 12인 값이 insert되었다면 버퍼풀과 디스크 영역에 저장된다. 

 

그리고 area컬럼의 '서울'을 '경기'로 update한다고 가정하자.

 

커밋 실행 여부와 상관없이 버퍼 풀의 영역은 업데이트 된 값으로 변경되었고, undo 로그에 이전 값이 들어 있다. 만약 커밋 전이라면 언두 영역에 있는 데이터를 반환한다. 

 

언두 로그의 두가지 용도

  • 트랜잭션 보장 : 트랜잭션이 롤백되면 변경 전 데이터로 복구해야 하는데 이때 언두 로그에 백업해둔 데이터를 이용해서 복구한다
  • 격리 수준 보장 : 특정 커넥션에서 데이터를 변경하는 도중에 다른 커넥션에서 데이터를 조회하면 트랜잭션 격리 수준에 맞게 변경중인 레코드를 읽지 않고 언두 로그에 백업해둔 데이터를 읽어서 반환하기도 한다. 

 

 

 

???? 그런데 버퍼 풀의 더티 데이터가 언두 로그의 내용이고 버퍼 풀에서 리두 로그 엔트리와 연결 된 것중에 체크 포인트 해서 디스크로 반영된다는 말인가 ???? 언두 로그와 버퍼 풀의 연관관계는 잘 모르겠다.. 

블로그의 정보

kiwi

키위먹고싶다

활동하기