데이터베이스

[DB] ARIES

KyooDong 2021. 6. 12. 19:59
728x90

ARIES recovery 알고리즘

LSN(Log Sequence Number) : 로그의 offset 값(로그 레코드의 대푯값)

페이지 맨 앞에 LSN 을 저장하여 관리함 = Page LSN = Data block 에 반영된 가장 마지막 로그 레코드 번호를 의미

-> 불필요한 redo 를 막음

 

특징

  • Repeating history 기법을 기반으로 만들어졌으며, recovery 작업을 일반 처리처럼 자연스럽게 처리하고자 함
  • Not force / steal
  • WAL
  • Page LSN
  • RecLSN : Redo pass 에서 어느 레코드부터 시작해야하는지 스킵할게 있는지 확인
    • 현재 페이지가 dirty page table 에 들어가는 순간, 마지막 레코드 LSN 을 RecLSN 으로 지정
    • 따라서 RecLSN 은 update log 중 가장 최신 로그 번호
  • Physiological redo (Physical redo + Logical redo)
    • Physical logging : 로그 레코드를 파일에 저장
    • Logical logging : SQL문 자체를 저장
      • Logical redo = Delete 의 redo 로그 = insert
      • index 가 있는 테이블의 경우 delete 가 인덱스 파일에도 영향을 미치기에 이런 방식을 사용
  • Dirty page table 생성 및 관리 : (버퍼 상에서) write 가 수행된 페이지 리스트 : 불필요한 redo 를 없애기 위함
  • Fuzzy-checkpoint 사용 : dirty page 에 한해서
    • CP를 만들어도 버퍼에 있는 로그/데이터 블록을 디스크에 저장하지 않음
    • Dirty block 에 대한 “정보"만 디스크에 저장 -> CP 후에도 디스크가 consistent 하지 않음
    • 대신 CP 생성 오버헤드가 적음, 다른 트랜잭션들이 정지하지 않음
    • Recovery 시 start 레코드를 찾기 위해 analysis pass 가 필요함
  • 다양한 로그레코드 타입
    • Insert
    • Update
    • Delete
    • Compensation (CLR = Compensation Log Record) = Undo 작업 시 남기는 로그
  • 로그 레코드 구조
    • 모든 로그 레코드는 동일 트랜잭션 내의 직전 레코드의 LSN 또한 저장하고 있음
  • Compensation Log Record
    • abort 된 트랜잭션에 대해 redo 가 완료된 후에는 old value 를 가져야하는데 compensation log 가 없으면 new value 가 최종 저장됨
    • UndoNextLSN 을 가짐 : 이미 undo 작업을 한 상황에서 또 하지 않게 하기 위함

4894, 7200 은 Dirty page table 에 있으므로 이 둘은 update(write) 가 된 페이지이며 update log 중 가장 최근 로그번호는 7564, 7565 임. PageLSN 인 7567, 7565번부터 Redo 작업을 수행하면 됨

 

ARIES 알고리즘 구성

  • Analysis pass
    • Redo pass 때 어떤 로그부터 Redo 해야하는지
    • Undo-list 구축
  • Redo pass
    • RedoLSN 부터 모든 action 을 다시 수행함
    • RecLSN과 PageLSN 을 통해 불필요한 redo 를 하지 않음
  • Undo pass
    • incomplete transaction 에 한해서 rollback 함

 

 

  1. Analysis pass
    1. RedoLSN 구하기 : Dirty page table 내 모든 페이지의 RecLSN 중 가장 작은 값
    2. Undo-list 구하기 : checkpoint 로그 레코드 내의 모든 트랜잭션 리스트
      1. undo-list transaction 의 마지막 로그 레코드의 LSN 을 읽음
    3. Forward scan
      1. undo-list 에 있지 않은 트랜잭션의 로그가 발견되면 해당 트랜잭션을 undo-list 에 넣음
      2. update 로그 레코드 발견 했는데 해당 페이지가 Dirty page table 에 없으면 RecLSN 을 해당 로그 레코드의 LSN 으로 지정하고, Dirty page table 에 추가
      3. 트랜잭션의 종료 로그 레코드 발견 시 undo-list 에서 제거
  2. Redo pass
    1. Forward scan
      1. RedoLSN 부터 스캔
      2. update 로그레코드 발견했는데 해당 페이지가 Dirty page table 에 없거나 해당 로그 레코드의 LSN 이 RecLSN 보다 작으면 skip
      3. 그 외에는 해당 페이지를 디스크로부터 읽어오고, 그 페이지의 PageLSN 이 해당 로그 레코드의 LSN보다 작으면 redo 함
  3. Undo pass
    1. Backward scan : undo-list 의 모든 트랜잭션에 대해서 undo 작업 수행
      1. prevLSN, undoNextLSN 등으로 스킵하면서 최적화