Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184309
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-26 14:22
个人简介

做最Low逼的DBA

文章分类

全部博文(46)

文章存档

2017年(46)

我的朋友

分类: Oracle

2017-05-06 17:28:38

Killing Oracle Sessions Operation

一、介绍

Oracle和外部,有很多方法可以杀掉不正常的会话

   1.Identify the Session to be Killed

   2.ALTER SYSTEM KILL SESSION

   3.ALTER SYSTEM DISCONNECT SESSION

   4.The Windows Approach

   5.The UNIX Approach


  1.Identify the Session to be Killed

  如果杀死了错误的会话,杀死会话可能是非常具有破坏性的,所以在确定要杀死的会话时要非常小心

  如果杀死属于后台进程的会话,则会导致实例崩溃

SET LINESIZE 100

COLUMN spid FORMAT A10

COLUMN username FORMAT A10

COLUMN program FORMAT A45

 

SELECT s.inst_id,

       s.sid,

       s.serial#,

       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';

 

   INST_ID        SID    SERIAL# SPID       USERNAME   PROGRAM

---------- ---------- ---------- ---------- ---------- ---------------------------------------------

         1         30         15 3859       TEST       sqlplus@oel5-11gr2.localdomain (TNS V1-V3)

         1         23        287 3834       SYS        sqlplus@oel5-11gr2.localdomain (TNS V1-V3)

         1         40        387 4663                  oracle@oel5-11gr2.localdomain (J000)

         1         38        125 4665                  oracle@oel5-11gr2.localdomain (J001)

 

SQL>

  SID 和 Serial# 替换成第二点的语句进行执行

2.ALTER SYSTEM KILL SESSION

?  杀掉会话的基本语法如下所示

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';


RAC环境中,您可以选择指定INST_ID,显示在查询视图GV$SESSION

允许在不同的RAC节点上杀死一个会话

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id';

Kill session命令实际上并没有杀死会话。它只是要求会话自杀。在某些情况下,例如等待来自远程数据库的应答或回滚事务,会话不会立即自动终止,并等待当前的操作完成。在这些情况下,会话将具有“被标记为杀死”的状态。它将会尽快被杀死。

?  上面描述的语法之外,还可以添加立即执行参数

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

  这不会影响命令执行的工作,但它会立即将控制权返回给当前会话,而不是等待确认杀死

  如果标记的会话持续了一段时间,可能会要考虑在操作系统级别上终止进程

  在执行此操作之前,检查它是否执行回滚是否支持的

  这可以通过运行这段脚本(session_undo.sql)。如果USED_UREC值减少会话的问题,应该把它完成回滚,而不是杀死会话在操作系统层



3.ALTER SYSTEM DISCONNECT SESSION

  ALTER SYSTEM DISCONNECT会话语法是杀死Oracle会话的另一种方法。不像杀了会话命令要求会话杀死自己,断开会话命令杀死专用服务器进程(或虚拟电路在使用共享服务器),相当于杀死从操作系统服务器进程。

  基本的语法类似于杀死会话命令的POST_TRANSACTION协议

  SID和 Serial#的值相关会话可以替换成下面的语句之一

SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;

SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;


  POST_TRANSACTION定义等待正在进行的事务完成前断开会话,而当前的session立即断开会话和正在进行的事务回滚。

  POST_TRANSACTIO和IMMEDIATE可以一起使用,但文档指出,在这种情况下, IMMEDIATE的定义将被忽略。此外,语法图表明这两个子句都是可选的,但实际上,必须指定一个或两个子句,否则就会收到一个错误。

SQL> alter system disconnect session '30,7';

alter system disconnect session '30,7'

                                     *

ERROR at line 1:

ORA-02000: missing POST_TRANSACTION or IMMEDIATE keyword

 

SQL>

  这个命令意味着永远不需要切换到操作系统来杀死会话,这减少了错误杀掉进程的机会


4.The Windows Approach

  要在Windows操作系统上杀死会话,首先要识别会话,然后将相关的SIDSPID值替换为从命令行发出的命令

C:\> orakill ORACLE_SID spid

  会话将会立即终止会话线程,并释放所有资源


5.The UNIX Approach

  警告:如果您使用的是Oracle 12c中的多线程模型,那么您不应该试图杀死操作系统进程。要知道原因,请阅读本文


  要想在UNIXLinux操作系统上杀死会话,首先要识别会话,然后将相关的SPID替换为下面的命令

% kill spid


  如果在几分钟后进程没有停止,那么使用下面的方法终止会话

% kill -9 spid


?  确认该SPID是否还存在

% ps -ef | grep ora

  会话将会立即终止会话线程,并释放所有资源











































阅读(1544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~