Database/RDS

InnoDB - Undo Log, Redo Log

류큐큐 2024. 8. 14. 09:52

이 두 가지 로그는 데이터 일관성과 무결성을 유지하는 데 중요한 역할.

 

언두 로그(Undo Log)

언두 로그는 트랜잭션이 수행되기 전의 데이터 상태를 저장하는 역할.

  1. 트랜잭션 롤백: 트랜잭션이 롤백될 때, 언두 로그에 기록된 이전 데이터를 이용해 데이터베이스를 원래 상태로 복구할 수 있다.
  2. MVCC(Multi-Version Concurrency Control): 여러 트랜잭션이 동시에 접근할 때, 트랜잭션의 일관성을 유지하기 위해 언두 로그를 사용. 예를 들어, 하나의 트랜잭션이 어떤 행을 업데이트하고 있지만 아직 커밋하지 않은 상태라면, 다른 트랜잭션이 이 행을 읽으려고 할 때 언두 로그를 참조하여 업데이트되기 전의 데이터를 제공. 이는 트랜잭션 격리 수준을 유지하고, "Read Committed"나 "Repeatable Read" 같은 격리 수준에서 일관된 데이터를 제공하는 데 사용.

리두 로그(Redo Log)

리두 로그는 커밋되지 않은 변경 사항을 기록하여 시스템 장애가 발생했을 때 복구할 수 있게 하는 역할.

  1. 크래시 복구: 만약 시스템이 장애로 인해 중단되었다면, 리두 로그에 기록된 변경 사항을 기반으로 데이터베이스를 복구할 수 있다. 리두 로그는 변경된 데이터를 디스크에 기록하기 전에 먼저 로그에 기록되며, 이를 통해 복구 시점에 트랜잭션의 상태를 재현할 수 있다.
  2. WAL(Write-Ahead Logging): InnoDB는 변경 사항을 실제 데이터 페이지에 쓰기 전에 리두 로그에 먼저 기록하는데, 이를 WAL이다. 이 방식은 장애 발생 시에도 데이터 일관성을 유지하는 데 필수적.

 

트랜잭션 동작의 예:

  1. 트랜잭션 A가 어떤 행을 업데이트: 트랜잭션 A가 행을 업데이트할 때, 해당 행의 이전 값이 언두 로그에 기록. 또한, 업데이트된 데이터는 리두 로그에 기록.
  2. 트랜잭션 B가 같은 행을 읽음: 트랜잭션 A가 아직 커밋되지 않은 상태에서 트랜잭션 B가 동일한 행을 읽으려고 하면, 트랜잭션 B는 이 행이 수정되었지만 아직 커밋되지 않았음을 인지. 이때 트랜잭션 B는 언두 로그를 참조하여 트랜잭션 A가 업데이트하기 전의 값을 읽는다.
  3. 트랜잭션 A가 커밋: 트랜잭션 A가 커밋되면, 리두 로그에 기록된 변경 사항이 실제 데이터 페이지에 반영. 이때 언두 로그는 더 이상 필요하지 않게 되며, 이후 가비지 컬렉션에 의해 삭제될 수 있다.