• [Oracle] Kill Session 经验总结


    在Oracle的日常维护中,经常出现以下两种情况需要我们DBA kill session:
    1. App抱怨他们的应用hang住了,在数据库里查询得知他们的session被其它session block,此时要把其它session kill掉,以便App应用能及时跑完。
    2. App的应用跑到一半,突然决定不跑了,需要DBA把他们的session kill掉。
    以下是我经常采用的kill session的方法:
    1. 在数据库层面用语句alter system kill 'sid, serial#'
    2. 在某些特殊情况下,方法1无法使用,便在OS层面执行kill -9
    采用以上方法经常碰到的问题是:对于那些已经跑了很久的session,不是一下子就能kill掉的,有时要等很久,此时就只能傻傻的在那等,当App那边的人问“session消失了吗?如果没有消失,还要等多久?”等等之类的问题的时候,总是无法给他们确切的答案,直到今天看了Ask tom里的一篇文章后,才找到解决方法。
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4974573906087

    1. alter system kill 'sid, serial#'这条语句会做什么?
    每当执行以下语句时:
    A105024@O02DMS1>alter system kill session '524,24148';

    System altered.

    总是能很快的返回System altered的结果,很多人误以为此时session已经被killed了,其实不然,该语句只是发出一个命令,告诉这个session:你被killed掉了,如果此时session为空闲状态,它可以马上结束,但是如果此时session正在做一个事务,它在结束前需要将事务回滚,并释放锁。

    因此,对于那些需要长时间回滚才能被kill掉的session来说,在执行alter system kill session之后,它的状态变成KILLED,比如:
    select username, status from v$session where sid= 524;

    SID             STATUS
    --------------- ----------

    524             KILLED


    2. KILLED状态的session还要多少时间才能消失?

    如果去评估KILLED状态的session还要多少时间才能消失呢?我们可以查询v$transcation中的USED_UBLK,比如used_ublks当前值为500,1分钟后剩下400,那么你可以估计该session大概还需要400/(500-400)=4分钟的时间才能结束,以下是一个实际中的例子:
    select used_ublk from v$transaction;

    USED_UBLK
    ----------
    2262

    1 row selected.

    SQL> /

    USED_UBLK
    ----------
    1430

    1 row selected.

    SQL> /

    USED_UBLK
    ----------
    1103

    1 row selected.

    一直监控USED_UBLK的值,只要它不等于0,该session还是处于KILLED的状态:

    select username, status from v$session where sid= 524;

    SID             STATUS
    --------------- ----------
    524             KILLED

    select used_ublk from v$transaction;

    USED_UBLK
    ----------
    1048

    1 row selected.

    SQL> /

    USED_UBLK
    ----------
    489

    1 row selected.

    SQL> /

    no rows selected

    没有USED_UBLK返回,说明回滚已经结束。

    3.为什么USED_UBLK的值已经为0了,session还是显示killed的状态?

    这是因为必需得等到client端收到ORA-00028错误之后,session才会消失,换句话说,即使session已经回滚完毕,但如果client端还没有确认,session还是保持在killed的状态,如:

    select used_ublk from v$transaction;

    no rows selected

    虽然USED_UBLK已经为0了,但是session还是killed的状态:

    select username, status from v$session where sid= 524;

    SID             STATUS
    --------------- ----------
    524             KILLED

    在client端,尝试任何执行语句,都会出现ORA-00028:

    SQL> select instance_name from v$instance;
    select instance_name from v$instance
    *
    ERROR at line 1:
    ORA-00028: your session has been killed

    此时session才会消失:

    select username, status from v$session where sid= 524;

    no rows selected

    4. kill -9与alter system kill session的区别

    alter system kill session的原理是让session自己把自己kill掉,也就是session自己回滚;而kill -9是让pmon清理session。
    kill -9的速度看起来比alter system kill session要快一些,这是因为pmon会做一些并行的处理,让回滚更快一些,
    但是kill -9不建议使用,因为:
    1. 在OS层面直接kill进程,存在未知的风险;
    2. 容易误操作,如果万一把Oracle的关键进程(如smon)kill掉,会造成数据库宕机的事故;
    3. 无法监控事务回滚进度。
    所以,不到万不得已的情况下,尽量不要用kill -9。

  • 相关阅读:
    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
    Linux第二周学习总结——操作系统是如何工作的
    通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
    期末总结
    实验报告(实验五)
    HTTPServletResponse
    Eclipse 枚举类报错
    出现Unreachable code问题的原因
    myeclipse自动保存修改代码
    ssh连接虚拟机失败解决办法
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3073309.html
Copyright © 2020-2023  润新知