原文地址:https://oracle-base.com/articles/18c/alter-system-cancel-sql-18c
原文作者:Tim Hall

Oracle Database 18C 引入了 ALTER SYSTEM CANCEL SQL 命令,用于取消会话中的 SQL 语句,提供了杀死恶意会话的替代方法。

目录

语法

ALTER SYSTEM CANCEL SQL 命令的基本语法如下所示:

1
2
3
4
5
ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';

AI写代码sql

* 1

如果不加 INST_ID,默认代表当前
实例
。如果 SQL_ID 不写,则代表是在当前指定会话中运行的 SQL。参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 当前实例的会话中的当前 SQL
ALTER SYSTEM CANCEL SQL '738, 64419';

-- INST_ID = 1 的实例会话中的当前 SQL
ALTER SYSTEM CANCEL SQL '738, 64419, @1';

-- 在此实例的会话中指定的 SQL
ALTER SYSTEM CANCEL SQL '738, 64419, 84djy3bnatbvq';

-- 在实例的会话中指定 SQL 和 INST_ID = 1
ALTER SYSTEM CANCEL SQL '738, 64419, @1, 84djy3bnatbvq';

AI写代码sql

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11

可以从视图中检索所有四条
信息
GV$SESSION,如下所示。

指定要取消的会话


后台
会话中取消 SQL 语句可能具有很大的破坏性,因此在查询会话和 SQL 时要非常小心。

GV$SESSION 使用视图查询有问题的会话和 SQL,以下查询连接到 GV$
PROCESS
视图以获取 SPID 列,这对于此命令并不是必需的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
SET LINESIZE 150
COLUMN spid FORMAT A10
COLUMN username FORMAT A30
COLUMN program FORMAT A45

SELECT s.inst_id,
s.sid,
s.serial#,
s.sql_id,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';

AI写代码sql

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15

然后可以将相关值替换到前面部分中的命令 SID, SERIAL#, INST_ID and SQL_ID 中。