SQLite에서의 Logging & Recovery

Luna Park·2022년 11월 26일
post-thumbnail

Force와 Steal

Forec와 Steal은 트랜잭션 처리 시 데이터 기록에 관한 옵션들이다.

Force

트랜잭션이 완료된 후 바로 데이터를 디스크에 기록할 것인가?

  • Force: 바로 기록한다
  • No-Force: 바로 기록하지 않는다(Redo 필요)

트랜잭션이 완료되었으므로 당연히 기록할 것 같지만 성능 효율 등을 이유로, 대부분의 DBMS는 적당히 기록해야 할 때 기록하는 No-Force 매커니즘을 사용한다고 한다.

Redo란?

이미 커밋한 트랜잭션의 수정을 재반영하는 복구 작업

Steal

트랜잭션이 완료되지 않은 상태에서 데이터를 디스크에 기록할 것인가?

  • Steal: 기록한다(Undo 필요)
  • No-Steal: 기록하지 않는다

트랜잭션이 완료되지 않았으므로 당연히 기록하면 안될 것 같지만 성능 효율 등을 이유로, 대부분의 DBMS는 적당히 미리 기록하는 메커니즘을 사용한다고 한다.

Undo란?

아직 완료되지 않은 트랜잭션이 수정한 페이지들도 디스크에 출력될 수 있으므로, 만약 해당 트랜잭션이 어떤 이유든 정상적으로 종료될 수 없게 되면 트랜잭션이 변경한 페이지들은 원상 복구되어야 한다.

따라서 대부분의 DBMS는 버퍼 관리 정책으로 Steal을, 커밋 정책으로 No-Force을 사용한다.

Logging Technique

대부분의 DBMS는 Steal과 No-Force 정책을 사용하기 때문에 Redo와 Undo 로그가 필요하다.
로그란 Redo와 Undo 동작의 ordered list로, 각 행마다 LSN(Log Sequence Number, log record의 position), transactionID, pageID, offset, length, old data, new data, 추가적인 컨트롤 정보 등이 포함되어 있다.

Logging의 종류

Physical(value) Loggig

value 그 자체를 저장하는 로깅 방법. 변경 전의 Before Image와 After Image를 모두 저장한다.

Logical Logging

operation을 기록하는 로깅 방법. 실제 작업을 수행한 명세서를 저장하는 방식이다. physical logging에 비해 가볍지만, 복잡하고 sql을 재실행해야 하며, Recovey가 어려운 단점이 있다고 한다.

Physio-logical Loggig

physical과 logical loggig의 장점을 합친 로깅 방법. Recovery가 쉬우며, compact한 log size를 제공한다.

Log

  • Redo log: update된 페이지들이 disk에 커밋되지 않았더라도 commited transactions에 대해 durability를 보장한다.
  • Undo log: uncommitted 혹은 중단된 transactions에 대해 atomicity(=nothing)을 보장한다.

WAL(Write-Ahead Log) protocol

disk에 page를 쓰기 전에 관련된 Undo 정보가 로그에 써져야 한다.
( == flush undo log prior to writing a page to disk)

Log-Force-at-Commit

트랜잭션이 정상적으로 종료 처리되기 위해서는 먼저 Redo 정보가 로그에 써져야 한다.

Checkpoint

Recover할 때, 너무 많이 되돌아가지 않도록 하기 위해 DBMS에서는 주기적으로 checkpoint를 생성한다. checkpoint로 설정한 지점 이전까지는 트랜잭션이 성공적으로 수행이 되어서 disk에 확실하게 저장된 상태를 의미한다.

예를 들어 위의 그림에서,

  • T1은 이미 commit된 상태이므로 제외
  • T2는 checkpoint 이전에 실행된 내용은 commit되었으므로, checkpoint 이후의 내용을 redo
  • T3는 failure 시점에 실행 중이었으므로, checkpoint 시점으로 undo
  • T4는 checkpoint 이후에 실행되었고, failure 시점 전에 실행이 끝났으므로 redo
  • T5는 checkpoint 이후에 실행되었고, failure 시점에 실행 중이었으므로 시작 지점까지 undo

Fuzzy checkpoint

checkpoint를 만들 때 실행 중인 모든 트랜잭션을 중지하고 디스크에 버퍼의 값을 저장하는데, 트랜잭션을 중지하지 않고 checkpoint를 만드는 방법을 fuzzy checkpoint라고 한다.

  1. 잠깐 모든 트랜잭션을 중지한다.
  2. < checkpoint L >을 log db에 저장한다.
  3. dirty block에 대해 리스트를 만든다.(리스트 M)
  4. 1에서 중지된 트랜잭션을 다시 시작한다.
  5. M에 대해서 디비 스토리지에 저장을 한다.
  6. checkpoint를 가리키는 last_checkpoint를 방금 수행한 로그 레코드로 업데이트

    즉, recover할 때 로그를 순회하면서 마지막 체크포인트를 찾아다니는 것이 아닌 last_checkpoint로 찾아가 바로 forward scanning을 수행한다.

SQLite RBJ mode

SQLite는 운영체제의 비정상 종료나 갑작스러운 전원 차단이 발생했을 때, 사용자 데이터의 일관성을 유지하기 위해 Rollback Journal을 제공한다.

Rollback Journal(RBJ)

롤백 저널 파일은 트랜잭션 과정 동안 데이터베이스 파일 쓰기 상태 이전의 초기 값을 복원하는데 필요한 정보를 담는 파일이며, 각각의 데이터베이스 파일마다 롤백 저널 파일을 유지한다.

(강의 내용 파악이 아직 다 안되어서 이후 부분은 좀따 정리하도록 하겠다....)

참조

profile
Happy Ending Is Mine

0개의 댓글