-
[SQL] Oracle Process란?(+Instance)프로그램/SQL 2024. 7. 31. 21:59
| Process란?
프로세스의 사전적 의미는 '컴퓨터에서 연속적으로 실행되고 있는 프로그램이다.'라고 설명되어 있습니다. 조금 더 익숙한 표현으로 말하자면 사용자나 다른 프로세스로 부터 요청 받아 컴퓨터가 해야할 일(또는 하고 있는 일)입니다.
| Processor란?
프로세서와 프로세스는 차이가 있으며, 프로세서는 CPU나 MicroProsessor를 의미합니다. 이러한 프로세서는 프로세스를 동작시키는 하드웨어적 장치로 용어를 구분해서 사용하시길 바랍니다.
| Process 생명 주기
프로세스는 생성부터 종료까지 아래와 같은 생명 주기가 존재하며, 실행에서 대기로 상태가 변경되는 것을 Block이라 하며, 이는 I/O가 이루어지면서 블록을 가져오기 때문입니다. 즉 SQL의 성능 저하는 대기 상태에서 발생하는 것을 알 수 있습니다(Process와 I/O가 SQL 속도에 미치는 영향 보러가기).
<Process 생명 주기>
| Oracle Process
그렇다면 오라클에는 어떤 프로세스가 존재할까요? 오라클에는 여러가지 프로세스가 존재하며, 그 중 필수 프로세스라고 불리는 5가지를 설명드리도록 하겠습니다.
1. SMON(System Monitor)
- 오라클 인스턴스를 관리하는 프로세스
- 인스턴스 Fail시 Redo Log Files에서 Log를 찾아 인스턴스를 복구
- 임시 세그먼트를 정리하고, 사용하지 않는 공간을 회수
- 테이블 스페이스 내의 미사용 공간을 통합해 디스크 공간의 단편화를 줄임
2. PMON(Process Monitor)
- 오라클 서버에서 사용되는 프로세스들을 감시하는 프로세스(오라클 프로세스의 감독관)
- 정상적으로 작동하지 않는 프로세스들을 찾아서 종료
- 비정상적으로 종료된 프로세스들을 정리해 SGA 리소스를 재사용
- 커밋되지 않은 트랜잭션을 롤백(Undo 데이터를 활용)
3. DBWn(Database Writer)
- 변경된 데이터(DB Buffer Cache에 있는 Dirty Buffer Block)를 Data Files에 기록
- DBWR이라고도 한다.
4. LGWR(Log Writer)
- DB Buffer Cache에서 발생한 변화를 Redo Log Buffer에 기록
- 아래와 같은 조건이 만족되었을 때, Redo Log Files에 Log를 저장
1) Commit으로 트랜잭션이 완료되었을 때
2) Redo Log Buffer가 일정 이상 찼을 때
3) Check Point가 발생하였을 때
4) 일정시간(기본 3초)마다 저장
5. CKPT(Check Point)
- SGA 메모리에 있는 변경 사항들을 DB의 Data Files로 저장하는 것을 보장
- Check Point 동작 시, LGWR 프로세스를 통해 Redo Log Files로 변경 사항을 모두 옮기고 DBWn 프로세스를 통해 Data Files에 Dirty Buffer를 연동 시킴
- Check Point를 Data Files와 Control Files에 저장
5개의 오라클 프로세스, SGA를 합치면 아래 그림과 같은 Instance를 나타낼 수 있습니다. 인스턴스란 SGA와 프로세스를 통합한 것으로 메모리와 프로세스를 다루는 작업공간 입니다. 요번 포스팅에서 살펴본 프로세스 외에도 ARCn과 같은 다른 프로세스들 존재하며, 기회가 된다면 다루어 보도록 하겠습니다.
<Oracle의 Instance>
| 데이터 변경 시 Instance 동작 순서
- DB Buffer Cache에는 'Free Buffer', 'Dirty Buffer', 'Pinned Buffer' 세 가지가 있으며, 데이터가 변경된 경우 Dirty Buffer에 변경사항이 기록됩니다.
- Dirty Buffer의 변경 사항이 Redo Log Buffer에 기록됩니다.
- 특정 조건을 만족하였을 때(3초 마다, Commit 시, Check Point 등) Redo Log Buffer(in SGA)의 내용이 Redo Log Files(in DB)에 저장됩니다.
- 이후 Dirty Buffer가 많아져 임계값에 도달했거나, Block을 저장할 Free Buffer가 없거나, Check Point가 동작하는 등의 경우 DBWn 프로세스가 DB Buffer Cache에 있는 Dirty Buffer를 Data Files에 기록해 Free Buffer를 확보합니다.
| Q. 데이터 수정 시, 바로 DBWn을 사용하지 않고 LGWR을 동작한 후에 DBWn을 사용하는가?
DB에 수정 사항이 발생 했을 때, DBWn을 통해 바로 Data Files로 Dirty Buffer 내용을 옮겨 연동 시키면 안되나? 왜 굳이 LGWR을 통해 Redo Log Files로 옮기고 DBWn으로 Data Files로 한번 더 옮기는가?라는 의문이 들 수 있습니다.
DBWn과 LGWR 모두 DB 디스크에 저장하는 방법으로 I/O가 발생해 프로세스가 대기 상태로 들어갑니다. 하지만 DBWn은 Random 액세스 방식(임의 쓰기)이며, LGWR은 Append 방식(순차적 쓰기)으로 I/O가 동작해 속도 차이가 발생합니다. 즉, LGWR은 디스크의 연속된 위치에 데이터를 기록해 빠르게 Redo Log Buffer를 옮길 수 있어 LGWR로 변경 사항을 안전하게 기록하고(예상치 못한 Fail에 대비해 변경 사항을 저장) 이후 한번에 DBWn을 통해 Data Files에 Dirty Buffer를 연동 시킵니다. 이는 Redo의 목표 중 Fast Commit에도 연관되어 Redo와 Undo를 설명할 때 다시 말씀드리도록 하겠습니다.
'프로그램 > SQL' 카테고리의 다른 글
[SQL] Redo와 Undo (0) 2024.08.01 [SQL] Process와 I/O가 SQL 속도에 미치는 영향 (0) 2024.06.18 [SQL] SGA란? (0) 2024.06.11 [SQL] 데이터베이스 저장 구조 (0) 2024.05.28 [SQL] Function vs Procedure (0) 2024.05.28