반응형
오라클에서 AP/WAS 접속 서비스 식별하는 방법
데이터베이스에 붙는 AP/WAS(애플리케이션 서버)나 배치, 도구 접속을 구분하려면 세션 메타데이터를 보는 게 가장 빠릅니다.
핵심은 “DB가 아는 정보(서버/프로그램/앱이 넘겨준 모듈)”를 조합해서 어떤 서비스가 붙었는지 실무적으로 식별하는 것입니다.
개요
오라클 DB는 기본적으로 “정확히 어떤 WAS 서비스인지”를 100% 자동 판별하진 못합니다.
대신 아래 컬럼 조합으로 거의 실무 수준의 식별이 가능합니다.
MACHINE 접속 서버명/호스트
PROGRAM 클라이언트 프로그램
MODULE 애플리케이션 모듈명
ACTION 세부 기능명
CLIENT_IDENTIFIER 사용자/시스템 식별값
SERVICE_NAME DB 서비스명
실무 기준으로 보면
MODULE/ACTION/CLIENT_IDENTIFIER가 찍히는 환경이 가장 분석이 쉽습니다.
반대로 앱이 값을 넣지 않으면 PROGRAM이 “JDBC” 계열로만 보여서 서비스 식별이 어려워질 수 있습니다.
MODULE/ACTION/CLIENT_IDENTIFIER가 찍히는 환경이 가장 분석이 쉽습니다.
반대로 앱이 값을 넣지 않으면 PROGRAM이 “JDBC” 계열로만 보여서 서비스 식별이 어려워질 수 있습니다.
환경
- 대상 DB: Oracle Database
- 주요 뷰:
V$SESSION,V$PROCESS,V$SESSION_CONNECT_INFO, (필요 시)V$SQL - 권한: 해당 뷰 조회 권한 필요(운영 환경에서는 계정/권한 정책에 따라 제한될 수 있음)
증상
- DB에 연결된 외부 서비스(AP/WAS/배치/툴)가 무엇인지 확인이 필요함
- 특정 DB 계정(APP 계정 등)이 “어느 서버에서 어떤 형태로” 사용되는지 추적해야 함
- 접속이 급증했는데, 어떤 서버/모듈 조합이 원인인지 빠르게 집계해야 함
1차 점검
1) 현재 접속 중인 사용자 세션 확인
SELECT
s.sid,
s.serial#,
s.username,
s.osuser,
s.machine,
s.program,
s.module,
s.action,
s.client_identifier,
s.status,
s.logon_time,
s.service_name
FROM
v$session s
WHERE
s.type = 'USER'
AND s.username IS NOT NULL
ORDER BY
s.logon_time DESC;
해석 포인트
MACHINE: “어느 서버/호스트에서 왔는지” 후보를 잡는 1순위
PROGRAM: JDBC/OCI/툴 접속(예: SQL*Plus, DBeaver 등) 구분
MODULE/ACTION: 앱이 넣어준 값이면 서비스 식별에 가장 유용
MACHINE: “어느 서버/호스트에서 왔는지” 후보를 잡는 1순위
PROGRAM: JDBC/OCI/툴 접속(예: SQL*Plus, DBeaver 등) 구분
MODULE/ACTION: 앱이 넣어준 값이면 서비스 식별에 가장 유용
2) JDBC/모듈 기반으로 AP/WAS 세션만 추리기
SELECT
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
s.module,
s.action,
s.service_name,
s.logon_time
FROM
v$session s
WHERE
s.type = 'USER'
AND s.username IS NOT NULL
AND (
s.program LIKE '%JDBC%'
OR s.module IS NOT NULL
)
ORDER BY
s.machine, s.logon_time;
운영 환경에서는 “툴 접속”과 “서버 풀링 접속”을 분리하는 것만으로도 원인 후보가 크게 줄어듭니다.
심화 분석
3) 어떤 서버/프로그램/모듈 조합이 많은지 집계
SELECT
s.machine,
s.program,
s.module,
COUNT(*) AS session_count
FROM
v$session s
WHERE
s.type = 'USER'
AND s.username IS NOT NULL
GROUP BY
s.machine,
s.program,
s.module
ORDER BY
session_count DESC;
4) 세션(SID)과 DB 서버 OS 프로세스(SPID) 매핑
SELECT
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
s.module,
p.spid AS os_pid,
s.status,
s.logon_time
FROM
v$session s,
v$process p
WHERE
s.paddr = p.addr
AND s.type = 'USER'
AND s.username IS NOT NULL
ORDER BY
s.logon_time DESC;
5) 드라이버/접속 배너로 JDBC/OCI 등 접속 방식 확인
SELECT
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
ci.network_service_banner
FROM
v$session s
JOIN
v$session_connect_info ci
ON s.sid = ci.sid
WHERE
s.type = 'USER'
AND s.username IS NOT NULL
ORDER BY
s.sid;
중요
일부 환경에서는 V$SESSION의 MACHINE이 IP가 아니라 호스트명/DNS/중계 서버명으로 찍힙니다.
“특정 IP”를 기준으로 찾고 싶다면, DB 뷰만으로 안 보이는 케이스가 있어 리스너 로그/네트워크 로그가 더 정확할 수 있습니다.
일부 환경에서는 V$SESSION의 MACHINE이 IP가 아니라 호스트명/DNS/중계 서버명으로 찍힙니다.
“특정 IP”를 기준으로 찾고 싶다면, DB 뷰만으로 안 보이는 케이스가 있어 리스너 로그/네트워크 로그가 더 정확할 수 있습니다.
6) 특정 DB 계정이 어떤 AP/WAS에서 쓰이는지 확인
SELECT
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
s.module,
s.action,
s.client_identifier,
s.status,
s.logon_time
FROM
v$session s
WHERE
s.username = 'APPUSER'
ORDER BY
s.logon_time DESC;
7) 실행 중인 SQL까지 같이 보기(필요 시)
SELECT
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
s.module,
s.action,
s.sql_id,
q.sql_text
FROM
v$session s
LEFT JOIN
v$sql q
ON s.sql_id = q.sql_id
WHERE
s.type = 'USER'
AND s.username IS NOT NULL;
복구
여기서 말하는 “복구”는 장애 조치라기보다, 원인 서비스(서버/모듈) 특정 후 즉시 통제에 초점을 둡니다.
1) 현재 서비스 성격을 한 번에 파악하는 집계 쿼리
SELECT
s.username,
s.machine,
s.program,
s.module,
s.action,
s.client_identifier,
s.service_name,
COUNT(*) AS cnt
FROM
v$session s
WHERE
s.type = 'USER'
AND s.username IS NOT NULL
GROUP BY
s.username,
s.machine,
s.program,
s.module,
s.action,
s.client_identifier,
s.service_name
ORDER BY
cnt DESC;
즉시 조치 예시(운영 정책에 따름)
특정 MACHINE/MODULE 조합이 폭증했다면
1) 해당 AP/WAS 풀 상태 확인
2) 배치/스케줄러 중복 실행 여부 확인
3) 연결 풀(Connection Pool) 누수/재시도 폭주 여부 점검
4) 필요 시 해당 서비스의 접속 정책(방화벽/리스너/계정)으로 임시 차단
특정 MACHINE/MODULE 조합이 폭증했다면
1) 해당 AP/WAS 풀 상태 확인
2) 배치/스케줄러 중복 실행 여부 확인
3) 연결 풀(Connection Pool) 누수/재시도 폭주 여부 점검
4) 필요 시 해당 서비스의 접속 정책(방화벽/리스너/계정)으로 임시 차단
재발 방지
1) 애플리케이션에서 MODULE/ACTION을 넣도록 표준화
권장 방향
애플리케이션에서 DB 접속 후 모듈/액션을 세팅하면, DB에서 서비스 식별이 압도적으로 쉬워집니다.
예:
(적용 방식은 프레임워크/드라이버에 따라 달라질 수 있으므로 개발 표준에 포함시키는 방식이 안전합니다.)
애플리케이션에서 DB 접속 후 모듈/액션을 세팅하면, DB에서 서비스 식별이 압도적으로 쉬워집니다.
예:
DBMS_APPLICATION_INFO.SET_MODULE / SET_ACTION 활용(적용 방식은 프레임워크/드라이버에 따라 달라질 수 있으므로 개발 표준에 포함시키는 방식이 안전합니다.)
2) MACHINE이 IP로 안 찍히는 환경 대비
- NAT/프록시/게이트웨이/커넥션 풀링 구조에서는 “최종 사용자 IP”가 DB에 그대로 보이지 않을 수 있음
- 이 경우 “리스너 로그 + 앱 로그 + 네트워크 장비 로그”를 함께 보는 절차가 필요
- 관리자 입장에서는, DB 단에서 식별 가능한 값(MODULE/CLIENT_IDENTIFIER)을 강화하는 편이 유지보수 비용이 낮음
3) 점검 체크리스트(짧게)
- 접속 급증 시:
machine + program + module집계로 1차 원인 후보 압축 - 특정 계정 이슈:
username = 'APPUSER'형태로 세션을 먼저 고정 - 툴 접속 구분: PROGRAM 기준(예: SQL*Plus/GUI툴/JDBC 등)으로 분리
- 식별력 강화: 앱 표준으로 MODULE/ACTION/CLIENT_IDENTIFIER 세팅
반응형
'지식 공유 > DBMS' 카테고리의 다른 글
| Oracle 19c RAC IP 변경 방법 정리 (0) | 2026.03.07 |
|---|---|
| [ORACLE] ORA-04030·ORA-27000·ORA-27001·ORA-27002 메모리 이슈 (0) | 2026.03.04 |
| 오라클 KISA 21~26번: 확인 SQL과 조치 방법 정리 (0) | 2026.02.25 |
| 오라클 KISA 16~20번: 확인 SQL과 조치 방법 정리 (0) | 2026.02.25 |
| 오라클 KISA 접근관리 11~15번: 확인 SQL과 조치 방법 정리 (0) | 2026.02.25 |
