查杀Oracle会话的正确姿势

10880阅读 0评论2019-01-29 dbwatcher
分类:Oracle

博客文章除注明转载外,均为原创。转载请注明出处。
本文链接地址:http://blog.chinaunix.net/uid-31396856-id-5817744.html

我们在很多时候需要中止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子句被忽略。此外,虽然说是两个子句都是可选的,但实际上,必须指定一个或两个,否则会报错误。



使用这个命令就不在需要切换到操作系统来终止会话,从而减少杀死错误进程的可能性。

3、CANCEL SQL方式中止会话
这个方式就比较高大上了,为例避免杀死恶意会话的替代方法。ALTER SYSTEM CANCEL SQL命令是在Oracle Database 18c中引入的,用于取消会话中的SQL语句。方法如下:
ALTER SYSTEM CANCEL SQL'SID,SERIAL [,@ INST_ID] [,SQL_ID]';
4、此外还有操作系统的方法:
(1)比如windows上面
C:\> orakill ORACLE_SID spid
(2)比如Unix/Liunx上的
kill  spid
kill -9 spid
5、确认带查杀的会话
如果杀死了错误的会话,kill会话可能会非常具有破坏性,假如查杀了后台进程的会话,则会导致实例崩溃。因此在查杀Oradcle会话时要非常小心。
我们可以通过gv$session和gv$process两个视图来确认要确认的会话。
生产环境,请务必谨慎!!!

6、不得已而为之的办法
大量长期非活动会话通常是由应用程序或应用程序服务器无法正确处理其连接的问题引起的。显而易见,根是在源头纠正问题。如果无法做到这一点,可以考虑以下选项之一。
通过数据库用户的profile来限制会话相关资源
CONNECT_TIME:会话的最长经过时间(以分钟为单位),无论是否处于活动状态。
IDLE_TIME:以分钟为单位的最长连续非活动时间。

创建profile
-- Kill sessions older than 2 hours.
CREATE PROFILE old_session_profile LIMIT
  CONNECT_TIME 120
/

-- Kill sessions older than 2 hours or inactive for 1 hour.
CREATE PROFILE old_or_inactive_sess_profile LIMIT
  CONNECT_TIME 120
  IDLE_TIME 60
/
将profile分配给用户
ALTER USER dbwatcher PROFILE old_or_inactive_sess_profile;
但也要谨慎,可能会误杀批处理和存储过程等任务,强烈的不建议啊。

---The end
上一篇:Oracle 重建dual表
下一篇:Linux 6 网卡配置