트랜잭션의 특성
트랜잭션을 구현하기 위해 ACID가 필요합니다. ACID를 구현하기 위해 리두와 언두가 필요합니다. ACID에 대해 먼저 알아봅시다.
ACID
Atomicity: 원자성
트랜잭션(분할 할 수 없는 데이터 변경의 최소 단위)에 포함되는 데이터 변경은 all or nothing을 갖는 특성을 의미합니다.
Consistency: 일관성
트랜잭션이 변경사항을 적용할 때 미리 예측된 방식으로 작동하는 것을 의미합니다.
Isolation : 격리성
트랜잭션을 다중으로 실행시키더라도 한개 한개 실행한 것과 결과값이 동일해야한다는 의미입니다. 즉 트랜잭션은 서로 독립되어 있습니다. DBMS에서 격리 수준을 설정할 수 있습니다.
Durability: 지속성
커밋한 트랜잭션은 장애가 발생하더라도 커밋(변경사항)은 적용되어야 합니다.
지속성을 구현하기 위해선
리두로그를 활용하여 성능을 향상시킵니다.
- 리두로그에 변경 기록을 정리한 후 그룹화 하여 I/O 요청을 함으로써 I/O 횟수를 줄입니다.
- 리두로그에 비동기적으로 변경 기록을 기록할 수 있습니다.
- 리두로그 파일이 포화되면 다른 리두로그 파일에 이어 기록합니다.
리두와 언두의 개념
롤포워드를 위해선 과거의 시점과 변경 이력(리두 로그)이 필요합니다.
롤백을 위해선 과거로 되돌릴 수 있는 변경이력(언두 로그)이 필요합니다.
SCN(System Change Number)
오라클 시계의 시간을 관장합니다.
리두의 아키텍처
클라이언트 요청
서버프로세스가 리두로그버퍼에 리두로그와 언두로그 생성. 이 때 데이터가 변경됨
LGWR가 리두로그를 리두로그파일에 기록한다
ARCH가 리두로그파일을 아카이브 리두로그파일에 옮긴다
리두로그파일은 임시보관장치이다
아카이브 리두로그파일은 장기 보관장치이다
LGWR 리두 로그 기록을 줄이는 방법
커밋 횟수 줄이기
write 캐시 가진 스토리지 사용하기
COMMIT_WAIT와 COMMIT_LOGGING 파라미터 조정하기
리두 정리
병렬처리
여러개의 서버프로세스가 클라이언트 요청을 처리한다.
높은 처리량
여러 서버프로세가 리두로그 버퍼에 리두로그를 비동기로 기록한다. COMMIT_WAIT 파라미터가 있다. 서버 프로세스가 리두로그를 리두로그 버퍼에 기록할 때 까지 기다릴지 말지를 결정하는 파라미터이다. Nowait 으로 설정 할 경우 리두로그 버퍼에 쓰여진 것을 처리 한 것으로 간주한다. Wait일 경우 LGWR가 리두로그를 리두로그 파일에 쓰는 것 까지 처리로 간주한다.
LGWR 리두로그 버퍼(메모리)에 기록한 리두로그를 리두로그 파일에 기록하는 프로세스가 있다. 해당 프로세스를 관장하는 파라미터로 COMMIT_LOGGING이 있는데 해당 값은 Immediate, Batch 2가지를 가진다. 전자는 리두 로그가 메모리에 쓰여지는 즉시 리두로그 파일에 기록하는 것이고 후자는 모아두었다가 한번에 기록하는 것이다.
ORACLE RDBMS가 높은 처리량을 가질 수 있는 이유는 바로 여러 서버프로세스가 리두 로그 버퍼에 비동기적으로 리두로그를 쓸 수 있기 때문이다.
응답중시
커밋 시 변경이력을 디스크에 기록하지 않고 리두로그에 기록한다.
커밋 데이터는 지킨다
오라클 내 LGWR 프로세스가 리두로그 버퍼에 있는 리두로그를 리두로그 파일에 기록함으로써 지속성을 실현한다. 해당 작업 이후 DBWR 가 버퍼캐시에 있는 데이터 블록을 더티로 마킹하고 마킹된 블록을 디스크에 기록한다.
언두의 아키텍처
- 클라이언트 사이드 커밋 요청
- 리두로그 버퍼에 리두 로그 생성
- 언두 정보는 언두 세그먼트(링버퍼)에 보관. 언두 세그먼트는 메모리에 있는 것
- 언두 세그먼트 포화시 링 버퍼가 커짐
- 언두 세그먼트는 언두 테이블 스페이스에 보관. 언두정보가 테이블스페이스에 기록되어야지 커밋이 완료됨
언두 세그먼트
자동 언두(UNDO_MANAGEMENT="AUTO")에 의해 언두 테이블 스페이스 내 언두 세그먼트의 개수가 정해진다. 수동으로 관리하는 버전에서 해당 개수를 정할 때 고려해야 하는 사항으로 데이터베이스의 워크로드와 undo_retention을 참고한다.
undo_retention 파라미터
해당 파라미터는 언두 정보를 얼만큼 들고 있을지를 정하는 파라미터이다. 커밋했더라도 일정 시간 언두 정보를 유지하고 싶을 때에도 유용하다.
언두 데이터
데이터 변경 작업시 언두 세그먼트에 언두정보가 생성된다.
여러 상황에서의 리두와 언두의 동작
- 롤백할 때의 동작
- 읽기 일관성에 동반되는 동작
- 커밋되지 않은 데이터를 읽어올 때 동작
- ORA-1555 에러 발생했을 때 동작
- 체크포인트 동작
- 인스턴스 복구 시 동작
롤백할 때의 동작
SMON 백그라운드 프로세스가 언두 정보를 활용하여 트랜잭션 전의 상태로 되돌린다.
읽기 일관성에 동반되는 동작
데이터 검색시 어떤 시점의 데이터를 보여주는 기능.
커밋되지 않은 데이터를 읽어올 때 동작
----------검색 시작(T1)----------변경 및 커밋(T2)----------데이터 읽기(T1)
위와 같이 트랜잭션1 사이 시점에 트랜잭션2의 변경 및 커밋이 일어난 후 트랜잭션2가 변경한 데이터를 읽어 오려고 할 때 변경되기 이전 시점의 데이터를 읽는다.
----------데이터 변경(T2)----------검색 시작 및 데이터 읽기(T1)----------커밋(T2)
위와 같이 트랜잭션2가 먼저 데이터를 변경한 후 트랜잭션1이 변경된 데이터를 읽으려고 할 때 언두 정보를 사용해 그 전의 데이터를 읽는다.
----------검색 시작(T1)----------대량의 데이터 변경 및 커밋 (T2)----------변경된 데이터 중 읽기(T1)
위와 같이 트랜잭션 1 사이에 대량의 데이터가 변경 될 경우 리두로그를 사용하여 변경되기 전의 데이터를 읽어오려고 시도하나 언두세그먼트가 덮어 씌워져 그 전의 데이터를 읽어올 수 없는 상황(ORA-1555)이 발생한다.
언두 에러(ORA-1555)
ORA-1555 에러는 시간이 많이 걸리는 데이터 검색 상황에서 그 사이에 대량의 데이터 변경이 발생하는 커밋 발생 시 언두 세그먼트가 덮어 씌워지면서 검색 시점에서 찾으려는 데이터를 찾지 못해 발생하는 에러이다. 위 에러가 발생 할 경우 언두 테이블 스페이스의 크기와 undo_retention 파라미터를 조정하여 커밋 이후에도 언두 세그먼트가 덮어 씌워지지 않게 조정함으로써 에러를 피할 수 있다.
체크 포인트 동작
체크포인트란 버퍼캐시 내 메모리의 데이터를 디스크로 동기화하는 작업을 의미한다. 동기화 주체는 DBWR이다. 즉 리두로그 파일을 디스크에 기록하는 것이다. 정기적으로 체크포인트 하여 롤포워드에 오랜 시간이 걸리지 않도록 한다. 그렇다고 너무 빈번하게 체크포인트하여 병목현상이 발생하지 않게 한다.
인스턴스 복구시 동작
오래된 데이터 파일에 리두로그를 적용하여 데이터를 최신 상태로 갱신(롤 포워드)합니다. 이 때 언두 정보가 리두로그에 들어가 있어 언두 정보가 최신화 됩니다. 최신화된 언두 정보를 토대로 커밋하지 않은 데이터를 롤백합니다.
9장 요약
- 리두는 오래된 데이터를 최신으로 만들기 위해 존재합니다.
- 언두는 최신 데이터를 오래된 데이터로 만들기 위해 존재합니다.
- 읽기 일관성을 위해 언두를 사용합니다.
- ORA-1555 발생 시 redo_retention 파라미터와 언두 테이블 스페이스를 튜닝합니다
- 인스턴스 비정상 종료 시 리두를 사용해 데이터 최신화 및 언두를 사용해 커밋하지 않은 데이터를 롤백합니다.
'DataBase > 그림으로 공부하는 오라클 구조' 카테고리의 다른 글
10장 백업/복구의 아키텍처와 동작 (0) | 2023.10.12 |
---|---|
8장 오라클의 대기와 락 (0) | 2023.10.09 |
7장 오라클의 데이터 구조 (1) | 2023.10.09 |
6장 커넥션과 서버 프로세시의 생성 (0) | 2023.09.24 |
5장 오라클의 기동과 정지 (0) | 2023.09.20 |