alter system cancel sql 'sid,serial#';
这条命令是oracle 18c的新特性,但是实际上12c里面就已经存在了。这条命令可以终止某条sql的运行,类似手动Ctrl+C。与kill会话是不同的。kill session是修改session的paddr进程地址,多个session被kill的话,这些session的paddr会被标记为同一个。
这条命令可以在cdb和pdb层面执行。利用这条命令就可以终止会话发起的不合理的sql,而不是暴力的直接干掉会话,使得会话之前的未完成事务回滚等好处。
查看数据库版本
SQL> select banner from v$version;
BANNER
------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 -
64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE 12.2.0.1.0 Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production
SQL> sho user con_name
USER is "SYS"
CON_NAME
------------------------------
CDB$ROOT
查询会话信息:
SQL> select sid,serial# from v$session where sid=(select userenv('SID') from dual);
SID SERIAL#
---------- ----------
802 56441
建一张测试表,并插入数据,但不要提交
SQL> create table ming.t1 (a int);
Table created.
SQL> insert into ming.t1 values(1);
1 row created.
SQL> select count(*) from ming.t1;
COUNT(*)
----------
1
当前会话下构建笛卡尔乘积:
SQL> select count(*) from ming.CDSY_KP_PUBLISHSTOCK;
COUNT(*)
----------
3967240
SQL> select * from ming.CDSY_KP_PUBLISHSTOCK a,ming.CDSY_KP_PUBLISHSTOCK b;
会话正在处理。
另一个会话:
SQL> select sid,serial# from v$session where sid=(select userenv('SID') from dual);
SID SERIAL#
---------- ----------
15 57567
SQL> alter system cancel sql '802,56441';
System altered.
此时查看802会话:
SQL> select * from ming.CDSY_KP_PUBLISHSTOCK a,ming.CDSY_KP_PUBLISHSTOCK b;
select * from ming.CDSY_KP_PUBLISHSTOCK a,ming.CDSY_KP_PUBLISHSTOCK b
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
但是之前的数据不受影响,还是可以正常提交。
SQL> select count(*) from ming.t1;
COUNT(*)
----------
1
SQL> commit;
Commit complete.