ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB] ARIES
    데이터베이스 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 등으로 스킵하면서 최적화

     

     

    '데이터베이스' 카테고리의 다른 글

    [DB] 데이터베이스 버퍼  (0) 2021.04.25
    [DB] Recovery 로깅 방식  (0) 2021.04.25
    [DB] Recovery 기본 개념 + Shadow  (0) 2021.04.25
    [DB] Isolation  (0) 2021.04.25
    [DB] 팬텀현상  (0) 2021.04.24

    댓글

Designed by Tistory.