본문 바로가기
study_db

오라클 뷰를 이용한 DB 세션 죽이기 (V$SESSION, V$SQL, V$SQLAREA)

by developer_j 2023. 12. 9.
728x90
반응형

특정 세션이 오래걸리면서 뒤따른 세션들이 주루룩 물려 병목현상 발생.. 그래서 해당 세션을 db에서 잘라내야 했다.

1 현재 계속 수행중인 세션의 id를 찾아, 2 해당 세션id를 가지고 있는 세션을 kill 해야 했다.

 

1. 계속 수행중인 세션 id 찾기

우선, db 접속이 발생하면 세션이 생성되어 고유 id와 serial number을 가진다. 이에 대한 기본적인 정보는 v$session 뷰에 위치한다.

오라클은 데이터베이스 접속이 이루어지면 세션을 시작한다. 세션은 사용자가 데이터베이스에 연결되어 있는 동안 계속 유지된다.
세션이 시작되면 오라클은 해당 세션에 세션 ID(SID)를 할당한다. 
v$session에서 각 세션은 고유한 SID(Session identifier)와 SERIAL#(serial number)를 갖는다.
시리얼 번호는 세션이 종료되었으나 다른 세션이 동일한 SID를 갖고 시작되었 때, 세션 명령들이 정확한 세션 객체에 적용될 수 있도록 보장해준다.

출처: https://jangpd007.tistory.com/238 [참 놀라운 세상:티스토리]

 

SELECT 
    SID         -- 세션 식별자
    , SERIAL#   -- 세션 일련 번호.
    , USERNAME  -- 오라클 사용자 이름
    , STATUS    -- 세션 상태 (ACTIVE- 현재 SQL을 실행 중인 세션)
    , SQL_ADDRESS -- 현재 실행 중인 SQL 문의 상세 식별자
    , SQL_HASH_VALUE -- 현재 실행 중인 SQL 문의 상세 식별자
FROM V$SESSION
WHERE STATUS = 'ACTIVE'
;

 

위의 쿼리문을 실행하면, ACTIVE 상태인 세션을 보여준다.
나의 경우에는 저 쿼리문을 여러번 실행하여 계속 진행중인 세션ID 를 수동으로.. 찾았다 ^^;;

V$SESSION 뷰에 대한 정보는 오라클 공식사이트에 잘 나와있다.

https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-SESSION.html#GUID-28E2DC75-E157-4C0A-94AB-117C205789B9

 

Database Reference

V$SESSION displays session information for each current session.

docs.oracle.com

 

 

SQL 쿼리문 내용까지 보고싶은 경우.

SELECT 
    A.SID         -- 세션 식별자
    , A.SERIAL#   -- 세션 일련 번호.
    , A.USERNAME  -- 오라클 사용자 이름
    , A.STATUS    -- 세션 상태 (ACTIVE- 현재 SQL을 실행 중인 세션)
    , A.SQL_ADDRESS -- 현재 실행 중인 SQL 문의 상세 식별자
    , A.SQL_HASH_VALUE -- 현재 실행 중인 SQL 문의 상세 식별자
    , B.SQL_TEXT --현재 커서에 대한 SQL 텍스트의 처음 1000자
FROM V$SESSION A
INNER JOIN V$SQL B 
    ON A.SQL_HASH_VALUE = B.HASH_VALUE 
    AND A.SQL_ADDRESS = B.ADDRESS
WHERE A.STATUS = 'ACTIVE'
;

 

 

2. 물려있는 세션 kill하기

KILL 할 세션의 ID와 SERIAL NUMBER 를 찾았다면 KILL 해준다.

ALTER SYSTEM KILL SESSION 'SID, SERIALNUMBER';

 

728x90
반응형