[Oracle] 사용자 세션을 수동으로 종료시키는 방법

ALTER SYSTEM KILL SESSIONALTER SYSTEM DISCONNECT SESSION은 사용자 세션을 수동으로 종료시키는 두 가지 방법입니다.

  1. ALTER SYSTEM KILL SESSION ‘sid,serial#[,@inst_id]’ IMMEDIATE;
    • 이 명령은 특정한 세션을 강제로 종료합니다.
    • 알아야 할 것은 ALTER SYSTEM KILL SESSION 명령이 세션을 직접적으로 죽이지 않고 단순히 세션한테 알아서 스스로 죽으라고 통보하는 것입니다. 경우에 따라 세션이 즉각적으로 중단되지 않을 때 현 세션이 오랫동안(때로는 영원히) 응답을 기다릴 수도 있습니다. 따라서, 바로 응답을 받기 위해서 IMMEDIATE 옵션을 추가합니다.
    • IMMEDIATE 옵션을 추가하면 세션이 죽은 것을 확인될 때까지 기다리지 않고 바로 현재 세션으로 리턴이 됩니다
    • 일반적으로 이 명령은 사용자가 원치 않는 또는 시스템에 해로운 세션을 종료하기 위해 사용됩니다. 예를 들어, 오랜 시간 동안 대기하고 있는 블로킹 세션을 종료하거나, 오류를 발생시키는 세션을 종료하는 경우에 사용됩니다.
    • [,@inst_id]는 RAC 환경에서 다른 인스턴스의 세션을 죽이고자 할 때 사용합니다.
  2. ALTER SYSTEM DISCONNECT SESSION ‘sid,serial#’ POST_TRANSACTION;
    • 이 명령은 특정한 사용자 또는 세션을 로그아웃하거나 종료합니다.
    • 일반적으로 사용자가 로그아웃할 수 있는 세션을 강제로 종료하기 위해 사용됩니다. 이는 사용자가 비정상적으로 세션을 유지하거나 데이터베이스 자원을 오랜 시간 동안 소비하는 경우에 유용합니다.
    • commit;나 rollback;으로 현재 진행 중인 트랜잭센(쿼리)이 처리된 후 DISCONNECT합니다. 만약 현재 수행 중인 transaction이 없다면 “KILL SESSION”과 동일한 효과를 갖습니다.
  3. ALTER SYSTEM DISCONNECT SESSION ‘sid,serial#’ IMMEDIATE;
    • POST_TRANSACTION과는 달리 바로 DISCONNECT 및 ROLLBACK 처리를 합니다.
  4. ALTER SYSTEM CANCEL SQL ‘SID, SERIAL#[, @INST_ID][, SQL_ID]’;
    • 18c부터는 CANCEL SQL 구문으로 session kill은 물론, SQL 단위로도 중단이 가능합니다.(User Cancel (ctrl+c) 과 동일 효과)

ALTER SYSTEM KILL SESSION 'sid,serial#[,@inst_id]' IMMEDIATE;ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION의 차이점은 아래 사례를 보시면 이해하시기 쉬울 것입니다.

ALTER SYSTEM KILL SESSION 'sid,serial#[,@inst_id]' IMMEDIATE; 사용 예
# Session 1 오픈 (a simple update of an existing table, T1): SQL> update t2 set object_id=object_id+1; 50317 rows updated. SQL> select min(sid) from v$mystat; MIN(SID) ---------- 137 # Session 2 오픈: SQL> select username, sid, serial# from v$session where sid=137; USERNAME SID SERIAL# ------------------------------ ---------- ---------- NIRADJ 137 92 SQL> alter system kill session ‘137,92’ immediate; System altered. # Session 1으로 돌아가서 아래 sql문을 실행합니다. 세션이 죽었다는 메세지가 출력됩니다.: SQL> select min(sid) from v$mystat; select min(sid) from v$mystat * ERROR at line 1: ORA-00028: your session has been killed  
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION; 사용 예
# Session 1 오픈(a simple update of an existing table, T1): SQL> update t2 set object_id=object_id+1; 50317 rows updated. SQL> select min(sid) from v$mystat; MIN(SID) ---------- 136 # Session 2 오픈: SQL> select username, sid, serial# from v$session where sid=136; USERNAME SID SERIAL# ------------------------------ ---------- ---------- NIRADJ 136 56 SQL> alter system disconnect session ‘136,56’ post_transaction; System altered. # Session 1으로 돌아가서 아래 sql문을 실행합니다. commit이나 rollback을 실행해야 세션이 죽었다는 메세지가 출력됩니다.: SQL> select min(sid) from v$mystat; MIN(SID) ---------- 136 SQL> rollback; Rollback complete. SQL> select min(sid) from v$mystat; select min(sid) from v$mystat * ERROR at line 1: ORA-00028: your session has been killed

다음 글에서 “오래된 비활성화 세션을 자동으로 죽이기” 위해 쉘 스크립트를 등록해 보겠습니다.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다