龙须面

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考:http://space.itpub.net/8183550/viewspace-669816

使用sql developer执行了更新记录操作后,既没有commit也没有rollback,网络就断开了,造成表或记录被锁住,待到超时后才会被解开,那样都会造成应用操作被阻塞。

可以以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象,然后杀除指定的会话。

用下面的语句查询被锁的对象,可以带上更多约束条件,如schemaname等更精确的匹配。

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


杀Seesion的SQL语句语法如下:

  1. alter system kill session 'sid, serial#'   

 如上面查出来的一条记录的sid是53, serial#为663,就执行以下的语句

    1.alter system kill session '53,663'    

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

拼凑kill语句的方式如下,下面加了一个过滤条件和一个排序,杀除真正关心的表,并且着重注意超时时间过长的会话。 

1.SELECT'alter system kill session '''|| c.sid ||''||','|| c.serial# ||''';',
2.       a.object_id, a.session_id, b.object_name, c.*
3.  FROMv$locked_object a, dba_objects b, v$session c
4. WHEREa.object_id = b.object_id
5.   ANDa.SESSION_ID = c.sid(+)
6.   ANDschemaname ='Unmi'
7. ORDERBYlogon_time
 
posted on 2012-11-20 11:39  木子小黑  阅读(1970)  评论(0编辑  收藏  举报