서버 프로세스와 백그라운드 프로세스
Oracle을 움직이는 세 종류의 프로세스(사용자, 서버, 백그라운드)의 역할과 메모리, 프로세스 장애 시 처리, 세션과 OS 프로세스를 연결해 확인하는 SQL
#핵심 요약
사용자 프로세스는 SQL*Plus, SQL Developer, 애플리케이션처럼 사용자가 실행한 프로그램이고 Oracle 메모리를 쓰지 않음
서버 프로세스는 사용자 요청을 받아 SQL을 실행하고 결과를 돌려주며 PGA를 씀
백그라운드 프로세스는 인스턴스 전체를 위한 관리 작업을 하며 자체 PGA를 쓰고 SGA에 접근함
사용자 프로세스가 비정상 종료되면 Oracle이 남은 세션, 트랜잭션, Lock을 자동으로 정리함
#개념과 동작 원리
#세 종류의 프로세스
| 구분 | 역할 | 메모리 |
|---|---|---|
| 사용자 프로세스 | SQL*Plus, SQL Developer, 애플리케이션 등 사용자가 실행한 프로그램 | Oracle 메모리 아님 |
| 서버 프로세스 | 사용자 요청을 받아 SQL 실행, 데이터 처리, 결과 반환 | PGA |
| 백그라운드 프로세스 | 인스턴스 전체를 위한 관리 작업 수행 | 자체 PGA와 SGA 접근 |
사용자 프로세스
| 요청
서버 프로세스
|
Oracle DB
백그라운드 프로세스
-> 인스턴스 전체 관리#연결, 세션, 서버 프로세스
| 구분 | 의미 |
|---|---|
| Connection | 클라이언트와 인스턴스 사이의 연결 통로 |
| Session | 로그인 후 생성되는 논리적인 사용자 상태 |
| Server Process | 세션의 실제 작업을 처리하는 프로세스 |
전용 서버(Dedicated Server)에서는 일반적으로 세션마다 서버 프로세스가 배정되고, 공유 서버(Shared Server)에서는 여러 세션이 서버 프로세스를 공유할 수 있음
#프로세스 장애 처리
| 장애 | 처리 |
|---|---|
| SQL 실행 오류 | 해당 명령만 실패 |
| 사용자 프로세스 종료 | Oracle이 자동 정리 |
| 미완료 트랜잭션 상태에서 종료 | Rollback, Lock 해제 |
| 사용자 실수, 파일 손상, 외부 장애 | DBA 개입 필요 |
프로세스 종료 감시와 자원 정리는 PMON 그룹이 담당함
#Trace File과 ADR
Trace File은 서버 프로세스와 백그라운드 프로세스가 남기는 진단, 성능 분석 기록임
ADR에는 Trace File과 Alert Log 같은 진단 정보가, FRA에는 백업과 복구 관련 파일이 있으며 둘은 서로 다른 저장 영역임
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| DBW | 더티 버퍼를 데이터 파일에 기록함 |
| LGWR | 리두 버퍼의 내용을 온라인 리두 로그에 기록함 |
| CKPT | 체크포인트 정보를 컨트롤 파일, 데이터 파일 헤더에 갱신하며 DBW에 기록을 요청함 |
| SMON | 필요 시 인스턴스 복구와 시스템 수준 정리를 담당함 |
| PMON, CLMN, CLnn | PMON은 비정상 종료를 감지하고 CLMN, CLnn에 정리 작업을 위임함 |
| RECO | 분산 트랜잭션의 실패를 자동으로 해결하는 프로세스임 |
| LREG | 인스턴스, 서비스 정보를 리스너에 등록함 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | 현재 세션과 서버 프로세스, 블로킹, 진단 경로, 백그라운드 프로세스 |
| 필요 권한 | SYS 계정 또는 각 동적 성능 뷰의 조회 권한을 부여받은 계정 |
| 바꿀 입력값 | 현재 세션 조회는 입력값 없음, 조사할 SID, 프로세스명은 실제 환경에 따름 |
| 결과 해석 | SID, SERIAL#, SPID, 진단 경로의 실제 조회 출력은 기재 없음 |
#현재 세션과 OS 서버 프로세스
SELECT s.sid, s.serial#, s.username, p.spid os_pid
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.sid = SYS_CONTEXT('USERENV','SID');결과 해석:
V$SESSION.PADDR와 V$PROCESS.ADDR를 이어 현재 세션을 처리하는 서버 프로세스의 OS 프로세스 번호(SPID)를 봄
#블로킹 세션
SELECT sid, serial#, blocking_session, event, seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL;결과 해석:
결과가 있으면 BLOCKING_SESSION이 그 세션을 막고 있는 세션 번호임
세션 진단은 성능 분야의 "세션과 블로킹 진단"에서 다룰 예정임
#진단 경로와 현재 Trace File
SELECT name, value FROM v$diag_info;
SELECT value FROM v$diag_info
WHERE name = 'Default Trace File';결과 해석: 개별 실행 출력은 기재 없음
#동작 중인 백그라운드 프로세스
SELECT * FROM v$bgprocess WHERE paddr <> '00';결과 해석:
수업 자료(인스턴스 문서)의 조회임PADDR가 00이 아닌 행만 남겨 실제로 떠 있는 프로세스를 본다는 의도로 보이나 설명은 기재 없음
#구문과 옵션 설명
V$PROCESS의 ADDR는 프로세스 상태 객체 주소, SPID는 OS 프로세스 식별값임
멀티스레드 구성에서는 SPID만으로 Oracle 프로세스가 유일하게 구분되지 않으므로 SOSID 또는 SPID, STID를 함께 구분함
V$BGPROCESS의 NAME, DESCRIPTION은 프로세스 이름, 설명이며 PADDR는 상태 객체 주소임
#사용 조건과 주의사항
프로세스 역할과 OS 식별값은 서로 다른 정보이며 프로세스 이름만으로 현재 작업의 성공을 판정하지 않음
Windows에서는 인스턴스의 Oracle 프로세스들이 OS 스레드로 구현됨
V$BGPROCESS의 PADDR가 00이 아닌 행을 조회하는 방식과 V$PROCESS의 OS 식별값을 함께 읽되 프로세스, 스레드 실행 모델을 구분함