我们在很多时候需要中止Oracle的会话,比如Oracle会话僵死,比如锁阻塞,比如undo切换文件,比如某些时候执行太长时间的SQL影响到了业务等等场景。本文给出查杀会话的一些方法和建议。 1、kill方式中止会话 ALTER SYSTEM KILL SESSION 使用方法如下: SQL> ALTER SYSTEM KILL SESSION 'sid,serial#'; 在RAC环境下,可以选择指定INST_ID。这允许在不同的RAC节点上查杀Oracle会话。 SQL> ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id'; KILL SESSION的命令实际上不会查杀会话。它只是发出中止的信号要求会话自己中止执行操作。但是在某些情况下会话不会立即自行终止,比如等待远程数据库的响应或回滚事务,在等待当前操作完成后才会去中止。在这些情况下,会话将具有“标记为杀死”的状态,然后该会话会尽快被中止。
也可以添加该IMMEDIATE子句。 SQL> ALTER SYSTEM KILL SESSION'Sid,serial#'IMMEDIATE; IMMEDIATE命令不会影响命令执行的工作,不用等待kill确认,就会马上将控制权返回给当前会话。 如果标记为kill状态的会话持续一段时间,可以考虑在操作系统级别终止该进程。在执行此操作之前,有必要检查它是否正在执行回滚。如果有USED_UREC问题的会话的值正在减少,则应该让它完成回滚而不是在操作系统级别终止会话。
2、disconnect方式中止会话 ALTER SYSTEM DISCONNECT SESSION ALTER SYSTEM DISCONNECT SESSION语法是中止Oracle会话的可选方法。与KILL SESSION要求会话自行终止的命令不同,DISCONNECT SESSION命令会杀死专用服务器进程,这相当于从操作系统中终止服务器进程。 添加POST_TRANSACTION子句的命令的功能基本类似于KILL SESSION。 使用方法如下: SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION; SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE; POST_TRANSACTION子句在断开会话之前等待正在进行的事务完成,而IMMEDIATE子句断开会话并且正在进行的事务立即回滚。 POST_TRANSACTION和IMMEDIATE条款可以一起使用,但官方文档指出,在这种情况下IMMEDIATE子句被忽略。此外,虽然说是两个子句都是可选的,但实际上,必须指定一个或两个,否则会报错误。