본문 바로가기
🛢️ Database

🩺 오라클 기준 DB 세션 모니터링 방법( v$session, v$process, v$sql ) | 세션정보 확인 추적 -> 문제세션 찾는 방법 -> 자동 모니터링 알람 설정

by 죄니안죄니 2025. 4. 6.

✅ DB세션이란

DB세션은 커넥션 풀에서 개별 커넥션이 유지하는 세션정보를 담은 커넥션 그 자체입니다.

즉, 커넥션 하나 = DB 세션 하나 🎯 DB내부 사용자의 상태, 작업공간 ( 아직 커밋되지 않은 변경 내용(트랜잭션)을 잠시 보관하고 실험하는 공간)

  • 애플리케이션이 DB에 접속하면, DB는 그 사용자에게 세션(Session) 이라는 공간을 만들어 줍니다.
  • 이 세션 안에서는 다음과 같은 것들을 따로 관리해요:
세션 안에서 관리되는 정보설명
트랜잭션 상태 BEGIN, COMMIT, ROLLBACK 여부
커서 정보 SELECT 결과 위치 (페이징 같은 기능에 사용)
변수/임시 테이블 Oracle의 GLOBAL TEMPORARY TABLE 등
언두(UNDO) 영역 아직 커밋되지 않은 변경 정보 저장
락 정보 어떤 행이 락 걸렸는지, 누가 점유 중인지

🔁 커밋 전에는 "나만 보는 가상 공간"

예를 들어:

BEGIN;

UPDATE accounts SET balance = balance - 10000 WHERE id = 1;

-- 이 시점에서 다른 트랜잭션은 balance가 바뀌었는지 모름!
-- → 내 세션에서만 반영됨 (언두/레드 로그와 버퍼에 있음)

COMMIT;
  • 이 UPDATE는 실제로 DB에 저장된 게 아니라, → 세션 내 메모리 공간에 “임시로 반영” 되어 있어요.
  • COMMIT 하기 전까지는 다른 세션에서는 절대 안 보임 → MVCC (다중 버전 동시성 제어) 방식 때문입니다.

📦 정말 작업공간처럼 쓰이는 대표적인 예

✅ Oracle의 임시 테이블 (Global Temporary Table)

CREATE GLOBAL TEMPORARY TABLE temp_data (
  id NUMBER,
  value VARCHAR2(100)
) ON COMMIT DELETE ROWS;
  • 이 테이블은 세션마다 별도 공간을 가짐
  • 다른 세션에는 안 보임 = 진짜 "나만의 공간"

✅ 정리하면

DB 세션은 사용자 1명이 작업하는 동안 DB가 따로 마련해주는 “작업 공간”이고,
그 안에서 트랜잭션이 커밋되기 전까지는 모두 “내 눈에만 보이는 결과”를 다룹니다.

 


🧠 참고로 이 덕분에 가능한 기술이 많아요:

  • ROLLBACK → 원래대로 복구
  • 비동기 SELECT → 다른 트랜잭션의 진행과 충돌 없음
  • 트랜잭션 충돌/충돌 방지 → 락 & 격리 수준

✅ 왜 DB 세션 모니터링이 중요한가?

DB의 성능 문제는 단순히 쿼리 성능에서만 오는 게 아니라, 
오래 열린 세션, 락을 잡고 있는 세션, 갑작스러운 커넥션 폭증 등 다양한 원인이 복합적으로 작용합니다.

특히 Oracle 환경에서는 세션 추적 → 병목 식별 → 알람 설정을 통한 지속적인 관찰과 대응이 매우 중요합니다.


🔍 Oracle 주요 뷰 소개

1. v$session: 현재 열려 있는 모든 세션 정보

  • 로그인한 사용자, 클라이언트 IP, 상태, 대기 이벤트 등 확인 가능
SELECT sid, serial#, username, status, osuser, machine, event
FROM v$session
WHERE username IS NOT NULL;
 

2. v$process: 실제 Oracle 백엔드 프로세스 정보

  • 서버 프로세스(PID), 메모리 사용량 등 리소스 기반 문제 추적 시 사용
SELECT p.spid, s.sid, s.serial#, s.username, s.program
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.username IS NOT NULL;

3. v$sql: 실행 중인 SQL 정보 (쿼리 식별)

  • 어떤 SQL이 수행 중인지, 비용이 얼마나 드는지 파악 가능
SELECT sid, serial#, username, status, osuser, machine, event
FROM v$session
WHERE username IS NOT NULL;
SELECT sql_id, sql_text, executions, elapsed_time/1000000 elapsed_sec
FROM v$sql
WHERE elapsed_time > 10000000
ORDER BY elapsed_sec DESC;

🔎 Java 애플리케이션에서 DB 세션 추적하기

Java 애플리케이션에서 Oracle에 연결된 세션을 추적하려면 program, module, action 값을 활용하는 것이 효과적입니다.

✅ Spring + Oracle JDBC 설정 예 : Spring Boot에서 로그로 세션 트래킹. 

Connection conn = dataSource.getConnection();
conn.unwrap(OracleConnection.class)
    .setClientInfo("OCSID.MODULE", "MyServiceModule");
  • Oracle SQL에서 MODULE 컬럼을 통해 어떤 서비스에서 접속했는지 확인 가능
SELECT sid, username, module, status FROM v$session WHERE module = 'MyServiceModule';
 

⚠️ 문제 세션 찾기 – 이런 것들을 모니터링 하자

유형 탐지 기준 SQL 예시
오래 열린 세션 상태가 INACTIVE이고 시간 길게 유지 1
락을 잡고 있는 세션 v$lock, v$session 조인 2
대기 중인 세션 특정 이벤트에서 대기 상태 지속  3
-- 1. 오래 열린 세션
SELECT sid, username, status, last_call_et/60 AS idle_min
FROM v$session
WHERE status = 'INACTIVE' AND last_call_et > 600;

-- 2. 락을 잡고 있는 세션
SELECT s.sid, s.serial#, s.username, l.type, l.id1, l.id2
FROM v$session s
JOIN v$lock l ON s.sid = l.sid
WHERE l.block = 1;

-- 3. 대기 중인 세션
SELECT sid, event, wait_class, seconds_in_wait
FROM v$session
WHERE state = 'WAITING' AND seconds_in_wait > 5;

 

 


📈 자동 모니터링 알람 구성

✅ 1. SQL Developer로 모니터링

  • SQL Developer > Reports > Sessions
  • 특정 조건에 따라 세션 색상 구분
  • 세션 종료 명령 제공: ALTER SYSTEM KILL SESSION 'sid,serial#';

✅ 2. Grafana + Oracle Exporter (Prometheus)

  • Oracle용 Exporter 설치 후 메트릭 수집
  • 주요 지표:
    • oracle_sessions (전체 세션 수)
    • oracle_sessions_active (ACTIVE 상태 세션)
    • oracle_sessions_waiting (WAIT 중인 세션)
  • 임계값 설정 → Slack, Email 알람 연동 가능

✅ 3. Spring Boot + Actuator + Micrometer 연동

  • 커넥션 풀 상태도 세션과 간접적으로 연결됨
management:
  endpoints:
    web:
      exposure:
        include: health, metrics
  • /actuator/metrics/hikaricp.connections.active 활용 가능

🧷 정리 – 실무 적용 팁

  • v$session, v$process, v$sql 조합은 가장 강력한 트러블슈팅 도구
  • Java 애플리케이션은 세션 추적값(MODULE 등) 세팅 필수
  • “잠재적 문제 세션”은 비활성 세션, 락 세션, 대기 세션
  • SQL Developer, Grafana, Actuator 등 다양한 도구로 자동화 가능

👉 다음 글에서는 트랜잭션 격리 수준과 세션의 관계를 실무 예제 중심으로 살펴보겠습니다.

 

세션모니터링

댓글