슬라이드 정리 자료

Outline

  • Failure Classification
  • Recovery and Atomicity
  • Log-Based Recovery
  • Shadow Paging
  • Recovery with Concurrent Transactions
  • Buffer Management

Failure Classification

  • 트랜젝션 실패

    • 논리적 오류
    • 시스템 오류(데드락 등)
  • 시스템 장애

  • 디스크 실패

  • Transaction이 실행되다가 failure 발생 undo (취소)

  • 데이터베이스 변경이 memory에서만 반영되고, DB에는 반영되지 않음. -> failure 발생 시 output이 없다. 다시 실행해야함. Redo

Recovery Algorithms

  • Recovery 알고리즘은 DB Consistency, transaction, atomicity, durability를 보장함
  • Failure 발생 –> log-record를 이용해서 DB를 이전상태로 복구하는 작업이 필요

Data Access (1/2)

  • 물리적 블럭은 디스크에 존재
  • 버퍼는 메모리에 존재
  • 디스크와 메모리 사이의 블럭 이동은 input(B)나 output(B)에 의해 발생
  • 각 트랜젝션 Ti는 work-area가 존재 (단순화 하기 위해 모든 데이터가 같은 블럭에 있다고 가정)

Data Access (2/2)

  • read(X)와 write(X) 사이에 블럭을 버퍼로 옮김
  • 트랜젝션
    • 최초로 X에 접근할 때 read(X) 수행
    • 추가적인 엑세스는 로컬 카피를 사용
    • 마지막 엑세스 이후 write(X)
  • output(Bx)는 write(X)를 즉시 수행할 필요가 없음

Example of Data Access

Recovery and Atomicity (1/2)

  • 트랜젝션이 커밋되는것을 확정지지 않은 상태에서 다른 수정을 하는것은 DB의 inconsitent 상태를 초래함
  • 트랜젝션 Ti가 A로부터 B에게 50$를 송금하는 것이라면 DB의 목표는 All or Nothing을 만드는 것
  • operation 수행 실패가 A에서 돈을 빼고 B에 돈을 넣는것을 완료하게 전에 일어날 수 있음

Recovery and Atomicity (2/2)

  • atomic 실패를 보장하기 위해 db에 수정을 가하기 전에 안전한 스토리지에 정보를 기술해두어야함
  • 2가지 접근방법
    • Log-based Recovery
    • Shadow-paging
  • 트랜젝션은 직렬로 실행되는 것을 가정함

Log-Based Recovery (1/2)

  • 모든 수정이력을 로깅함

  • 트랜젝션 Ti가 시작될 때 아래와 같이 기록

  • Ti가 write(X)를 실행하기 전에 아래 로그를 기록 > <Ti, X, V1, V2>

Log-Based Recovery (2/2)

  • Ti가 마지막 statement를 끝냈을때 아래를 기록

  • 로그기록은 direct로 안정된 스토리지에 기록됨을 가정

  • 2가지 로그 기록법(기록시점에 따라)

    • deferred
    • immediate

Deferred Database Modification (1/4)

  • Deferred Modification은 아래와 같은 전략을 취함
    • 모든 DB 수정은 스토리지에 로그로 기록
    • 실제 DB에는 부분적으로 커밋될때에 기록
  • 트랜젝션 시작은 아래를 기록 >

Deferred Database Modification (2/4)

  • Ti가 부분적으로 커밋될때 은 로그에 기록됨
  • 마지막으로 로그 레코드는 이전의 deferred를 기록하기 위해 쓰여짐

  • 장애로부터 복구 시 트랜젝션은 부터 까지 로그를 redo

  • redo Ti 모든 이전값을 새로운 값으로 옮기는 작업을 포함함

Deferred Database Modification (3/4)

  • 장애는 아래 상황이 일어날 수도 있음
    • 트랜젝션이 original 업데이트 되는 동안
    • recovery 액션이 수행되는 동안

Deferred Database Modification (4/4)



  • 안전한 스토리지에 있는 로그는 장애시 아래의 케이스로 쓰여짐 a. redo 액션이 필요없음 b. Redo(T0) 는 이 존재하므로 필요함 c. Redo(T0), Redo(T1) 필요

Immediate Database Modification (1/4)

  • immediate Modification은 모든 DB의 수정을 트랜젝션이 수행된는 동안에도 반영함

  • DB 기록 전에 업데이트 로그가 기록되어야 함

  • 업데이트된 버퍼 블록의 출력이 트랜젝션 커밋 이전이나 이후에 일어날 수 있음

  • 쓰여진 블록의 순서가 기록된 순서와 다를 수 있음

Immediate Database Modification (2/4)

Immediate Database Modification (3/4)

  • 복구 프로세스는 2가지 연산이 있음
    • Undo : Ti의 old값으로 backward로 업데이트
    • Redo : Ti의 new값으로 forward로 업데이트
  • 두 연산 모두 idempotent
    • 즉, 만약 연산이 여러번 실행되더라도 결과가 같음

Immediate Database Modification (4/4)

  • 실패이후 복구시
    • 이후 이 없으면 undo
    • 이후 이 있으면 redo
  • undo 연산이 먼저 실행되고 redo가 실행됨

Immediate Database Modification Recovery Example



  • recovery를 아래 3가지 케이스로 진행 a. Undo(T0) : A가 1000, B가 2000으로 restore b. Undo(T1) : C가 700으로 restore Redo(T0) : A 950, B 2050으로 변경 c. Redo(T0) : A 950, b 2050, C 600으로 변경

Checkpoints (1/2)

  • 기존 복구 프로세스의 문제점
    • 모든 전체 로그를 검색하는것은 시간이 많이 걸림
    • 대부분의 redo해야 하는 트랜젝션은 이미 DB에 기록되어 있음
  • 오버헤드를 줄이기 위해 시스템은 주기적으로 checkpoint를 수행함
    • 모든 로그를 안전한 스토리지로 기록
    • 모든 수정된 버퍼 블록을 디스크에 기록
    • 안전한 스토리지로 를 기록

Checkpoints (2/2)

  • 복구 프로세스 때 최근 체크포인트 전후의 트랜젝션만 고려함
    • 제일 마지막 로그에서 위로 checkpoint 레코드를 찾음
    • 이 부분에서 조금 더 위로 를 찾음
    • 보다 위 로그는 고려할 필요 없음
    • 시점 이후로 이 되지 않은 로그는 undo(Ti)
    • 로그를 앞으로 forward하면서 된 로그를 redo(Ti)

Example of Checkpoints

  • T1은 무시
  • T2와 T3는 redone
  • T4는 undo

Page And Page Table

  • 데이터 베이스는 고정된 길이의 블럭으로 나뉘어 지는데 이를 페이지라고 부름

  • 페이지는 디스크에 순서없이 저장됨

  • 페이지 테이블은 주어진 i에 따라 i번째 페이지로 찾아짐

Sample Page Table

Shadow Paging (1/6)

  • shadow paging은 log 기반 복구의 대안으로 트랜젝션이 직렬로 실행만 된다면 유용함

  • 페이지 테이블을 현재와 shadow테이블로 관리하는 기법

  • 트렌젝션이 시작할 때 두 페이지는 똑같음

  • shadow table은 트랙젝션이 수행되는 동안 shadow를 변하지 않음 반면에 현재 페이지는 변경 가능

  • 모든 입력과 출력 연산은 현재의 페이지 테이블을 사용함

  • 트랜젝션 커밋이 완료되면 shadow 페이지를 다시 현재 페이지와 같게 만듬

Shadow Paging (2/6)

  • Tj가 wirte(X)를 수행하고 X가 i번째 페이지라고 가정해보자.

  • 시스템은 아래와 같이 쓰기 연산을 수행

    • i번째 페이지가 아직 메모리에 없으면 input(X)를 수행

Shadow Paging (3/6)

  • 트랜젝션이 시작되면서 현재 페이지에 수정이 필요하면 아래의 작업 수행

    • 안쓰는 페이지를 디스크에서 찾음

    • i번째 페이지의 내용을 복사하여 위의 페이지로 복사

    • 현재의 페이지 테이블의 포인터를 위의 안쓰는 페이지로 이동

Shadow Paging (4/6)

Shadow Paging (5/6)

  • 트랜젝션을 커밋하기 위해
    • 페이지의 모든 수정을 메모리에서 디스크로 flush
    • 현재의 페이지 테이블을 디스크에 기록
    • 현재의 페이지 테이블을 shadow page 테이블로 만듦
  • shadow 페이지 테이블의 포인터가 쓰여지는 순간 트랜젝션이 커밋됨
  • 장애 이후 recovery가 필요하지 않음 새로운 트랜젝션은 shadow 페이지 테이블로 바로 시작가능하기때문
  • shadow 페이지 테이블이 가리키지 않은 페이지는 garbage임

Shadow Paging (6/6)

  • log기반 스키마에 비해 shadow 페이지의 장점
    • 로그를 기록하는 오버헤드가 없음
    • 복구가 쉬움
  • 단점
    • 전체 페이지 테이블 복사는 비용이 비쌈
    • 커밋 오버헤드가 큼
    • 데이터가 파편화 될 수 있음
    • 모든 트랜젝션이 완료된 후 기존의 페이지는 GC 되어야 함
    • 동시 트랜젝션을 허용하기 힘듦

Recovery With Concurrent Transactions (1/3)

  • 로그 기반 복구 스키마를 동시 트랜젝션 지원을 위해 수정해보자.
  • 로깅을 최대한 빠르게 기록한다.
  • checkpoint 테크닉과 액션은 변경이 필요함

Recovery With Concurrent Transactions (2/3)

  • 체크포인트가 이전에 수행되었는데 이부분을 아래와 같이 변경해보자. , L은 List라는 뜻.
  • 시스템이 복구될 때 아래의 것들을 수행해야함
    • undo-listredo-list를 초기화
    • 로그를 끝에서 부터 이 나타날때 까지 backward로 스캔
    • 이 발견되면 redo-list에 넣음
    • 가 발견되고 redo-list에 없으면 undo-list에 넣음
    • L안에 들어간 모든 Ti중에서 redo-list에 없는 녀석은 undo-list에 넣음

Recovery With Concurrent Transactions (3/3)

  • 이 시점에서 undo-list는 완료되지 않은 트랜젝션들이고 redo-list는 다시 실행되어야 하는 트랜젝션들이다.
  • undo-list를 먼저 수행하고 redo-lisst를 수행하는 것이 중요함

Log Record Buffering (1/2)

  • 로그 레코드 버퍼링 : 로그 레코드는 바로바로 디스크에 쓰여지는것 대신에 메인메모리에 버퍼됨
    • 로그 레코드는 버퍼가 꽉 차거나 log force연산이 수행될 때 디스크에 flush됨
  • Log Force는 로그 레코드에 기록된 모든 트랜젝션을 commit하기 위해 디스크에 flush됨
  • 몇몇 로그 레코드들은 하나의 연산에 한번에 디스크에 기록됨(I/O를 줄이기 위해)

Log Record Buffering (2/2)

  • 로그 레코드가 버퍼링 되면 아래의 룰을 지켜야 함
    • 로그 레코드는 생성된 이후 안전한 스토리지로 출력되어야함
    • 트랜젝션 Ti가 commit 상태로 가기 위해서는 로그가 먼저 스토리지에 기록되어야 함
    • 메모리의 데이터 블록 DB로 쓰여지기 전에 모든 로그 레코드는 스토리지로 기록되어야 함 -> 이 룰은 Write Ahead LogWAL 로그라 부름