728x90
오라클 아키텍처에서 데이터베이스의 정의
오라클에서는 디스크에 저장된 데이터 집합(Datafile, Redo Log File, Control File 등)을 데이터베이스
라고 부른다. 그리고 SGA (Server Global Area) 공유 메모리 영역과 이를 액세스하는 프로세스 집합을 합쳐서 인스턴스
라고 부른다.
오라클 백그라운드 프로세스 종류
- SMON(System Monitor)
- 오라클 인스턴스를 관리하는 프로세스, 오라클 인스턴스에 장애 발생 후 재가동 시 복구를 수행하고,임시 세그먼트와 익스텐트를 모니터링하여 데이터파일의 빈 공간 연결 → 하나의 큰 빈 공간으로 만듦. 더 이상 사용하지 않는 임시 블록 세그먼트를 재사용할 수 있도록 함.
- PMON(Process Monitor)
- 오라클 서버에서 사용되는 프로세스들을 감시. 이상이 생긴 프로세스가 사용하던 리소스를 복구함.
- DBWn(Database Writer)
- 버퍼 캐시에 있는 Dirty 버퍼를 디스크에 기록함.
- LGWR(LogWriter)
- 로그 버퍼의 내용을 디스크에 기록함.
- ARCn(Archiver): 꽉 찬 Redo 로그가 덮어 쓰여지기 전에 Archive 로그 디렉토리로 백업한다.
- CKPT(Checkpoint): Redo 로그에 기록해둔 버퍼 블록에 대한 변경사항 중 현재 어디까지를 기록했는디 관리한다. 갱시하는 주기가 길어질수록 장애 발생 시 인스턴스 복구 시간도 길어진다.
- Recoverer(RECO): 분산 트랜잭션 과정에 발생한 문제를 해결한다.
데이터 저장 구조
- 블록(Block, SQL Server등에선 Page): 데이터를 읽고 쓰는 단위
- 익스텐트(Extent): 공간을 확장하는 단위
- 세그먼트(Segment): 익스텐트의 집합. 논리적으로 묶어줄 뿐, 익스텐트 블록은 연속되지 않을 수 있음.
- 테이블 스페이스(Table Space): 세그먼트를 담는 컨테이너로서, 여러 데이터 파일로 구성.
Undo
Undo 로그를 사용하는 이유
- Transactoin Rollback(트랜잭션 롤백)
- Transaction Recovery(트랜잭션 회복. 이상 발생시 복구)
- Read Consistency(읽기 일관성 유지)
Snapshot Too Old 에러
오라클은 읽는 도중에 다른 트랜잭션에 의해 변경되었거나 변경이 진행중인 블록을 만날 시 Undo log를 읽어 CR Copy 블록을 만들어서 읽는다. 이때 필요한 Undo 블록이 다른 트랜잭션에 의해 사용되어 읽을 수 없는 상태가 되면 해당 에러가 발생한다.
Redo
Redo 로그를 사용하는 이유
Database Recovery(=Media Recovery)
- 물리적 디스크에 결함이 생기는 등 Media Fail 발생 시 데이터베이스를 복구하기 위해 사용되며, 이때는 Archived Redo 로그를 이용하게 된다.
Cache Recovery( → Instance Recovery 시 roll forward 단계)
Fast Commit
- Dirty 메모리 버퍼 블록을 데이터에 기록하는 과정은 Random 액세스 방식으로 이루어 지나, 로그는 Append 방식으로 기록되므로 속도 면에서 훨씬 빠르다. 그렇기에 트랜잭션에 의한 변경 사항을 Redo 로그로 남긴 후에 버퍼 캐시 블록과 데이터 파일 블록 간 동기화는 적절한 수단(DBWR, Checkpoint)을 이용해 일괄적으로 수행한다.
DML을 수행하는 사용자 프로세스가 로그 버퍼에 기록을 남기면, LGWR가 로그 버퍼 엔트리를 Redo 로그 파일에 기록한다.
메모리 캐시
- DB 버퍼캐시: 테이블 블록, 인덱스 블록, Undo 블록을 캐싱.
- 라이브러리 캐시: SQL, DB 저장형 함수/프로시저, 트리거를 캐싱.
- 딕셔너리 캐시: 테이블 정보, 인덱스 정보, 데이터파일 정보, 시퀀스 등을 캐싱.
- Result 캐시: SQL 결과 집합을 캐싱.
버퍼 블록 상태
- Free 버퍼(Clean 버퍼)
- 사용되지 않은 블록을 이야기한다. 오라클은 데이터파일로부터 새로운 데이터블록을 로딩하려면 먼저 Free 버퍼를 확보해야하며, Free 상태에서 변경 발생 시 즉시 Dirty 버퍼로 바뀐다.
- Dirty 버퍼
- 변경이 발생했지만, 아직 데이터파일에 기록되지 않은 블록을 이야기한다. 이 블록을 재사용하기 위해선 데이터파일에 먼저 기록해야하며, 그 순간 Free 버퍼로 상태가 바뀐다.
- Pinned 버퍼
- 읽기 또는 쓰기 작ㅇ버을 위해 현재 액세스되고 있는 버퍼 블록을 이야기한다.
'Database' 카테고리의 다른 글
인덱스 종류(알고리즘) (0) | 2023.06.10 |
---|---|
SQL 분석 도구 (0) | 2023.06.10 |
데이터베이스 I/O 매커니즘 (0) | 2023.06.09 |
SQL 처리과정 (0) | 2023.06.09 |
Active Session History(ASH) (0) | 2023.06.09 |