티스토리 뷰
오라클은 매우 복잡한 소프트웨어지만 결국 본질은 소프트웨어의 일종이다. 내부 알고리즘을 운영 체제 프로세스를 통해 구현한다. 오라클에서 사용하는 프로세스는 세 종류로 나뉜다. 유저 프로세스; 서버 프로세스; 백그라운드 프로세스; 이 중 백그라운드 프로세스는 다시 필수 백그라운드 프로세스와 선택 백그라운드 프로세스로 구분된다.
- DBWR: 데이터베이스 기록자 백그라운드 프로세스. DBWR 개수 파라미터는 DB_WRITER_PROCESSES이며, DBWR을 DBWn이라고도 부른다. 이것의 역할은 데이터베이스 버퍼 캐시 구성 요소 중 더티 버퍼를 기록한다. 기록된 버퍼는 클린 버퍼로 상태가 변경된다.
DBWR은 지연 쓰기(deferred write)와 빠른 커밋이라는 특징을 가진다.
- 지연 쓰기: 데이터베이스 버퍼 캐시로 복사된 데이터 블록이 변경되었을 때, 하나의 변경 발생 시 즉시 데이터 파일에 기록하는 것이 아니라, 일련의 여러 변경 작업 결과를 모은 뒤 함께 디스크의 데이터 파일에 기록한다. 그래서 지연 쓰기는 빈번한 디스크 I/O를 방지할 수 있다.
- 빠른 커밋: DBWR의 지연 쓰기로 인해 실제 데이터 파일은 변경 시점 즉시 기록되는 것이 아닌, 변경 이후 특정 시점에 저장(기록)되기 때문에 문제점이 발생한다. 그것은, 변경 값을 디스크에 기록하기 전, 만약 데이터베이스에 장애가 발생한다면 데이터 정합성이 깨질 수 있다. 그러므로 빠른 커밋이라는 특징을 도입하여, 변경에 대한 로그 정보를 변경 당시 바로 디스크에 기록(커밋)한다.
- 데이터베이스 버퍼 캐시의 종류:
더티 버퍼: 메모리에서 변경이 발생했으나 디스크로 저장되지 않은 버퍼.
클린 버퍼: 데이터베이스 버퍼 캐시의 변경 값이 디스크에도 기록 완료된 버퍼. 재기록 가능한 상태의 버퍼.
Pinned 버퍼: 지금 변경 중인 버퍼. 해당 버퍼를 사용할 세션은 대기.
- 버퍼 상태 변경 시나리오:
1. 디스크에 액세스해서 필요한 데이터 블록을 불러오고, 그것을 데이터베이스 버퍼 캐시에 캐싱한다. 이때 버퍼는 클린 버퍼 상태이다.
2. 동일 데이터 블록 요청 시 데이터베이스 버퍼 캐시에 액세스하여 데이터를 돌려준다.
3. DML문에 의해 버퍼 캐시값이 변경되는 과정 중일 때는 pinned 버퍼 상태가 된다.
4. 변경 완료 후에 더티 버퍼 상태가 된다.
5. DBWR은 변경된(최신의) 버퍼 캐시 값을 디스크의 원래 데이터 블록 위치에 기록한다. 그리고 버퍼 캐시는 클린 버퍼 상태가 된다.
- DBWR의 활동 주기: 변경 완료 후인 더티 버퍼 상태에서, 해당 더티 버퍼를 디스크에 기록하는 것은 위의 4, 5단계이다. 이렇게 더티 버퍼를 디스크에 기록하는 시점에는 몇 가지 조건이 있다.
1. 체크포인트 발생
2. 더티 버퍼 개수가 임계값에 도달
3. 데이터베이스 버퍼 캐시 내에 클린/프리 버퍼 부족
4. 테이블스페이스가 오프라인 OR 읽기 전용 모드로 변경
5. 테이블 DROP/TRUNCATE
6. 테이블스페이스에 온라인 백업 명령 수행
7. 주기적 타임아웃