오라클 아키텍처는 크게 다음과 같이 나눌 수 있다.
1. Oralce Database(DISK)에 있는 자료를 읽을 때 보다 빠르게 액세스하기 위한 메모리 영역(Instance)
2. 실제 자료를 저장하고 있는 영역(Database)
이 영역에 대해 사용자가 Oracle Application(SQL*PLUS, PL/SQL Developer, ...)을 가지고
DB에 연결하여 실제 데이터를 액세스하는 프로세스를 진행하면서 어떤 일들을 하는지 살펴보고
이를 통해 오라클 아키텍처를 이해해 보고자 한다.
사용자가 Database에 접근하기 위해 Application Program을 통해 접속을 하면
'USER PROCESS'가 할당이 되고 이 프로세스를 서버에 연결시켜주기 위해 'SERVER PROCESS'가 할당이 된다.
'SERVER PROCESS'에 PGA(Program Global Area)가 할당된다.
해당되는 인스턴스에 아이디와 패스워드를 입력하고 접속
conn user/password@instance_name;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 5 14:23:52 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
INSTANCE >
현재 자신이 접속한 'USER PROCESS'를 V$SESSION 동적뷰에서 확인
SELECT OSUSER,
SID,
STATUS,
DECODE(INSTR(PROGRAM, '(', 1, 1),
0,
PROGRAM,
SUBSTR(PROGRAM,
INSTR(PROGRAM, '(', 1, 1) + 1,
INSTR(PROGRAM, ')', 1, 1) -
INSTR(PROGRAM, '(', 1, 1) - 1)
) PROCESS,
TYPE,
EVENT
FROM V$SESSION
WHERE STATUS = 'ACTIVE' -- 활성화 되어 있는 세션만
AND TYPE = 'USER' -- USER PROCESS
;
OSUSER SID STATUS PROCESS TYPE EVENT
-------- ---- ------ ------------ ---- -------------------------
raxsoft 9886 ACTIVE sqlplusw.exe USER SQL*Net message to client
이 SQL은 세션중에 살아있는(ACTIVE) 세션과 'USER PROCESS' 데이터만 가져오기 위해 조건을 걸음
이렇게 조회를 할 경우 하나의 로우만 출력이 되며 현재 내 접속정보를 확인할 수 있음
OSUSER | OS 클라이언트 사용자 이름 |
SID | 세션 식별자 |
STATUS | 세션의 상태 |
PROGRAM | OS 프로그램 이름 |
TYPE | 세션 타입 |
EVENT | Oracle Wait Event |
현재 자신이 접속한 'SERVER PROCESS'를 V$PROCESS 동적뷰에서 확인
SELECT VP.ADDR,
VP.PID,
VP.SPID,
VP.USERNAME,
VP.PROGRAM
FROM V$SESSION VS,
V$PROCESS VP
WHERE VS.PADDR = VP.ADDR -- V$SESSION에서 V$PROCESS와 조인하기 위해 프로세스의 메모리 주소를 사용
AND VS.STATUS = 'ACTIVE' -- 활성화 되어 있는 세션만
AND VS.TYPE = 'USER' -- USER PROCESS
AND VS.OSUSER = 'raxsoft' -- 내 세션만 가져오도록
;
ADDR PID SPID USERNAME PROGRAM
---------------- --- ------ -------- -----------------------
070000016B32E4B0 20 377176 oraods instance_name
ADDR | 프로세스의 메모리 주소 |
PID | 프로세스 ID |
SPID | OS 프로세스 ID |
USERNAME | OS 유저 이름 |
PROGRAM | OS 프로그램 이름(RAC일 경우 Instance Name) |
인스턴스는 오라클의 메모리 영역으로 SGA Memory와 BackGround Process로 구성이 되어 있다.
SGA는 인스턴스에서 가장 중요한 메모리 캐시 영역을 담당하고 있으며 총 6개의 메모리 영역이 존재함
1) DB Buffer Cache
2) Shared Pool
3) Redo Log Buffer
4) Streams Pool
5) Large Pool
6)Java Pool
SGA 사이즈는 아래의 스크립트로 확인할 수 있다.
SHOW SGA
;
Total System Global Area 5,972,688,896 bytes
Fixed Size 2,089,824 bytes
Variable Size 2,499,808,416 bytes
Database Buffers 3,456,106,496 bytes
Redo Buffers 14,684,160 bytes
Total System Global Area | SGA를 구성하는 영역 크기의 합계로 SGA_MAX_SIZE 파라미터로부터 영향을 받음 |
Fixed Size | 데이터베이스나 인스턴스의 상태를 저장하는 영역으로, 백그라운드 프로세스가 액세스하는 영역 |
Variable Size | SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE 파라미터로부터 영향을 받음 |
Database Buffers | 데이터파일로부터 읽어 들인 데이터 블록 내용을 저장하는 영역 |
Redo Buffers | 데이터베이스에 가해진 모든 변경 사항에 대한 내역을 저장하는 영역 |
BackGround Process의 종류를 확인하려면 V$BGPROCESS 동적뷰를 통해 확인할 수 있다.
SELECT NAME,
PADDR
FROM V$BGPROCESS;
NAME PADDR
----- ---------------------------------------------------
ARB0 ASM Rebalance 0
ARC0 Archival Process 0
ASMB ASM Background
CJQ0 Job Queue Coordinator
CKPT checkpoint
CTWR Change Tracking Writer
DBW0 db writer process 0
DIAG diagnosibility process
DMON DG Broker Monitor Process
EMN0 Event Monitor Process 0
FMON File Mapping Monitor Process
GMON diskgroup monitor
INSV Data Guard Broker INstance SlaVe Process
LCK0 Lock Process 0
LGWR Redo etc.
LMD0 global enqueue service daemon 0
LMON global enqueue service monitor
LMS0 global cache service process 0
LNS0 Network Server 0
LSP0 Logical Standby
LSP1 Dictionary build process for Logical Standby
LSP2 Set Guard Standby Information for Logical Standby
MMAN Memory Manager
MMNL Manageability Monitor Process 2
MMON Manageability Monitor Process
MRP0 Managed Standby Recovery
NSV0 Data Guard Broker NetSlave Process 0
PMON process cleanup
PSP0 process spawner 0
QMNC AQ Coordinator
RBAL ASM Rebalance master
RECO distributed recovery
RSM0 Data Guard Broker Resource Guard Process 0
RVWR Recovery Writer
SMON System Monitor Process
이 중 내가 접속한 인스턴스에 있는 BackGround Process 또한 확인이 가능하다.
SELECT OSUSER,
SID,
STATUS,
DECODE(INSTR(PROGRAM, '(', 1, 1),
0,
PROGRAM,
SUBSTR(PROGRAM,
INSTR(PROGRAM, '(', 1, 1) + 1,
INSTR(PROGRAM, ')', 1, 1) -
INSTR(PROGRAM, '(', 1, 1) - 1)
) PROCESS,
TYPE,
EVENT
FROM V$SESSION
WHERE STATUS = 'ACTIVE' -- 활성화 되어 있는 세션만
-- AND TYPE = 'USER' -- USER PROCESS
ORDER BY TYPE, PROCESS
;
OSUSER SID STATUS PROCESS TYPE EVENT
-------- ----- ------ ------------ ---------- --------------------------------------------------------
oraods 9981 ACTIVE ARC0 BACKGROUND rdbms ipc message
oraods 9978 ACTIVE ARC1 BACKGROUND rdbms ipc message
oraods 9990 ACTIVE CJQ0 BACKGROUND rdbms ipc message
oraods 9993 ACTIVE CKPT BACKGROUND rdbms ipc message
oraods 9997 ACTIVE DBW0 BACKGROUND rdbms ipc message
oraods 9996 ACTIVE DBW1 BACKGROUND rdbms ipc message
oraods 9995 ACTIVE DBW2 BACKGROUND rdbms ipc message
oraods 9994 ACTIVE LGWR BACKGROUND rdbms ipc message
oraods 9998 ACTIVE MMAN BACKGROUND rdbms ipc message
oraods 9988 ACTIVE MMNL BACKGROUND rdbms ipc message
oraods 9989 ACTIVE MMON BACKGROUND rdbms ipc message
oraods 10000 ACTIVE PMON BACKGROUND pmon timer
oraods 9999 ACTIVE PSP0 BACKGROUND rdbms ipc message
oraods 9977 ACTIVE QMNC BACKGROUND Streams AQ: qmn coordinator idle wait
oraods 9991 ACTIVE RECO BACKGROUND rdbms ipc message
oraods 9992 ACTIVE SMON BACKGROUND smon timer
oraods 9947 ACTIVE q000 BACKGROUND Streams AQ: qmn slave idle wait
oraods 9975 ACTIVE q001 BACKGROUND Streams AQ: waiting for time management or cleanup tasks
oraods 9968 ACTIVE q003 BACKGROUND Streams AQ: qmn slave idle wait
raxsoft 9886 ACTIVE sqlplusw.exe USER SQL*Net message to client
여기서 사용되는 BackGround Process의 내용을 살펴보면 다음과 같다.
ARB0 | ASM Rebalance | |
ARC0 | Archival Process | 아카이브기능을 수행하는 프로세스 |
CJQ0 | Job queue process | 9i 부터 소개된 잡큐 프로세스 |
CKPT | Check Point | ※ 체크포인트는 마지막 체크포인트 이후에 변경된 모든 블럭을 데이타 파일에 쓰도록 유도하고 체크 포인트를 기록하기 위해 데이타 화일 헤더와 콘트롤 파일을 변경 (현재 Redo log와 Checkpoint번호로 data file과 Control file의 헤더를 동기화) ※ 온라인 리두 로그 화일이 채워지면 이것이 자동적으로 실행 ※ init.ora화일에 있는 log_checkpoint_interval파라미터는 체크포인트를 발생 주기로 조정하는데 사용 |
D000 | Dispatcher Process | ※ SL*NET V2멀티스레드 서버(MTS)구조의 한부분 ※ 다중 연결을 처리함으로써 필요한 자원을 최소화 하는데 도움을 줌 |
DBW0 | Database Writer | ※ 데이타 블럭 버퍼 캐쉬와 딕셔너리 캐쉬의 내용을 관리하는 프로세스 ※ Data Base Buffer cache 내용을 데이터 파일에 저장하는 작업을 수행 ※ DBWR숫자는 데이타베이스의 INIT.ORA 파일에 있는 DB_WRITERS 파라메타를 통해 지정 |
LGWR | Log Writer | ※ 리두로그버퍼의 내용을 온라인 리두 로그파일에 기록 ※ 일반적인 데이타베이스 작업 수행시 리두로그버퍼를 직접 읽어 온라인 리두 로그 파일에 기록하는 프로세스 |
LMS0 | global cache service process | |
MMAN | Memory Manager | ※ 공유 메모리의 자동 튜닝을 위하여 MMAN이라는 백그라운드 프로세스가 새롭게 등장 ※ MMAN이라는 백그라운드 프로세스가 5분 마다 주기적으로 수집한 작업 부하(Workload) 정보를 바탕으로 동적으로 구성되어 메모리는 가장 필요한 곳으로 동적으로 할당. ※ SPFILE을 사용하면 MMAN이 변경한 파라미터들의 정보가 자동으로 SPFILE에 저장되므로 가능한 Oracle 9i 이상부터는 SPFILE 의 사용을 권장 |
MMNL | Manageability Monitor Lightweight | ※ 10g부터 소개, AWR 기능용 프로세스 ※ MMNL 프로세스는 매초마다 active sessions의 스냅샷을 관리하고 계산하는 작업을 진행 |
MMON | Manageability Monitor | ※ MMON 프로세스는 약간의 시간 간격 사이에 발생되는 여러 통계 정보 스냅샷이나 미리 정의된 기준값을 초과할 때 위험을 알리는 등의 여러 가지 작업을 관리 ※ MMON 프로세스는 이와 같은 작업을 수행하기 위한 여러개의 하위 프로세스를 생성할 수 있음 |
PMON | Process Monitor | ※ 비정상 종료된 데이터베이스 접속을 종료 ※ 이전에 실패한 사용자 프로세스의 Resource를 풀어줌 (Lock되어 있는 프로세스가 소멸될 때 그 자원에 걸린 Lock를 해제) |
PSP0 | Process Spawner Process | 10g R2부터 소개된 프로세스 |
q000 | Queue Slave | QMN 슬레이브 프로세스, 구 QMNn 프로세스 |
QMNC | AQ Coordinator | QMN 코디네이터 프로세스 |
RECO | Recover Process | ※ 10g 이후에는 필수 프로세스 ※ 오라클7에서 분산 데이타베이스 내에서 발생한 오류를 해결하는데 사용 ※ 이 프로세스는 IN-DOUBT 트랜잭션과 관련있는 데이타베이스에 접속을 시도하면 그 트랜잭션을 해결 ※ init.ora화일에 distributed_transactions파라미터가 0보다 큰 값으로 지정되어야만 생성 |
SMON | System Monitor | ※ 시스템을 감시하는 기능 ※ 오라클 인스턴스 Fail시 인스턴스를 복구한다(온라인 리두 로그 파일을 사용) ※ 더이상 필요하지 않는 TEMPORARY SEGMENT를 제거 |