zoukankan      html  css  js  c++  java
  • 通过Kill Session杀掉Oracle中会话或死锁的方式

    通过Kill Session杀掉Oracle中会话或死锁的方式

    一.v$session,v$process,v$locked_object三张表的一些常见操作:
    1.查看当前总会话数和进程数

    select count(*) from v$session; 
    select count(*) from v$process;

    2.查询那些应用的连接数此时是多少

    select b.MACHINE, b.PROGRAM, count(*)
      from v$process a, v$session b
     where a.ADDR = b.PADDR
       and b.USERNAME is not null
     group by b.MACHINE, b.PROGRAM
     order by count(*) desc;


     

    3.查询是否有死锁:

    select * from v$locked_object; 

     如果查询结果为空,说明数据库中没有死锁。

    实例:

    在pl/sql中执行 [delete  from  news where id = 1;] ,但是没有进行commit。
    此时,执行 [select * from v$locked_object;],会出现如下结果:

     

    二.会话状态的说明:

    首先,查询Session中的sid,serial#,username,status,machine:

    select saddr, sid, serial#, paddr, username, status, machine
      from v$session
     where username is not null;


     

    1.active 处于此状态的会话,表示正在执行,处于活动状态。


    2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,
      killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,
      要用命令:alter system kill session 'sid,serial#' ;


    3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。(我一开始以为,
      只要是inactive状态的会话,就是该杀,为什么不释放呢。)其实,inactive对数据库本身没有什么影响,
      但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在oracle中
      直接设置超时时间,也是有两种方法,区别暂时还不清楚:

    (1).修改sqlnet.ora文件,新增expire_time=x(单位是分钟)  
    我的sqlnet.ora位置在D:Oracleproduct11.2.0dbhome_1NETWORKADMIN


    (2).通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。

    三.查找并kill死锁的session:

    1.查找:(注:若没有死锁的session,查询记录将为空。)

    (1).查询v$locked_object表

    select * from v$locked_object; 

    (2).以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象

    SELECT a.object_id, a.session_id, b.object_name, c.*
      FROM v$locked_object a, dba_objects b, v$session c
     WHERE a.object_id = b.object_id
       AND a.SESSION_ID = c.sid(+);


     

    2.Kill Session:

    alter system kill session 'sid, serial#';

    注:

    有时alter system kill session 'sid,serial#';并不能彻底的杀死会话。
    如果有ora-00031错误,则在后面加immediate;

    alter system kill session '29,5497' immediate; 

    例如:

    上面查出来的一条记录的sid是149, serial#为4153,就执行以下的语句:
    alter system kill session '149,4153' ;

    3.如果要一次性杀死多个会话,一个一个填写sid和serial#十分的繁琐,应该在查询被锁对象的同时拼凑出多条的杀会话语句,以分号分隔,一起复制下来,然后就可以批量的执行了。

    SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# || ''';',
           a.object_id,
           a.session_id,
           b.object_name,
           c.*
      FROM v$locked_object a, dba_objects b, v$session c
     WHERE a.object_id = b.object_id
       AND a.SESSION_ID = c.sid(+)
       AND schemaname = 'Unmi'
     ORDER BY logon_time
  • 相关阅读:
    angular2+ 使用ant.design 的 select组件时(nz-select)下拉框没有脱离文档流,直接撑开页面展示的问题
    element 获取table组件的下标
    调幅调频调相位
    Mongoose基于MongoDB建模并设置关联
    Xavier上TensorRT和Pytorch运行时间对比
    理解vue实例的生命周期和钩子函数
    [Vue]组件——.sync 修饰符实现对prop 进行“双向绑定”(子组件向父组件传值)
    vm.$attrs 【Vue 2.4.0新增inheritAttrs,attrs详解】
    (转)vue v-on修饰符
    Vue中的computed属性
  • 原文地址:https://www.cnblogs.com/dingding0505/p/4500369.html
Copyright © 2011-2022 走看看