프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c sql 취소 기능(alter system cancel sql)

오라클 18c 버전부터 내 세션의 sql 이 아닌 다른 세션의 sql 을 kill이 아닌 취소를 할수 있게됨
오래 실행되는 sql을 수행중인 세션을 kill 하는것이 아니라 sql 만 취소시킬 수 있음
dml문의 경우 이 기능을 이용해 세션 sql을 취소하면 dml이 롤백됨
테스트해본결과 sqlplus 에서 Ctrl+C를 눌려 캔슬하는것처럼 동작되는듯함

 

 

아래와 같이 사용가능함
구문

1
SQL> alter system cancel sql 'sid, serial, @inst_id, sql_id';

kill 구문과 비슷하게 sid와 serial이 들어감, 그리고 rac인 경우 instance_id 를 넣어줄 수 있음, 그리고 sql_id 지정이 가능함

 

 

테스트
세션1 sid 확인

1
2
3
4
5
SQL> select sid, serial# from v$mystat where rownum <= 1;
 
       SID
----------
       142

 

 

오래 걸리는 쿼리 수행

1
2
SQL> select count(*) from dba_segments, dba_segments;
(실행중)

 

 

세션2에서 세션1 sid, serial# 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
set lines 200 pages 1000
col username for a10
col sql_text for a50
select s.sid, s.serial#, s.username, s.sql_id, q.sql_text
from v$session s, v$sql q 
where s.sql_id = q.sql_id
and s.username = 'SYS'
and s.sid = 142;
 
       SID    SERIAL# USERNAME   SQL_ID        SQL_TEXT
---------- ---------- ---------- ------------- --------------------------------------------------
       142      33381 SYS        9xa63mc99x00u select count(*) from dba_objects, dba_objects
       142      33381 SYS        9xa63mc99x00u select count(*) from dba_objects, dba_objects

 

 

세션1의 sql 취소

1
2
3
SQL> alter system cancel sql '142, 33381, 9xa63mc99x00u';
 
System altered.

 

 

세션1 확인

1
2
3
4
SQL> select count(*) from dba_objects, dba_objects
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation

sql이 정상적으로 취소됨(Ctrl+C 를 눌려 취소한것과 같은 에러메세지가 발생함)

 

 

참조 : 

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-processes.html#GUID-7D8E5E00-515D-4338-8B86-C2044F6D2957
https://oracle-base.com/articles/18c/alter-system-cancel-sql-18c