oracle包被锁,Oracle开发包被锁解决办法-终极办法

http://www.itpub.net/forum.php?mod=viewthread&tid=1761963

以前在数据库维护中,基本都是碰到表被锁的情况,然后就是查找被锁的表相关的信息,通过v$session视图查找到相关的sid和serial#,通过

alter system kill session ‘sid,serial#’

kill掉相关的进程即可。但是今天碰到开发包更新过程中,连接中断,导致开发包一直被锁定的状态,无法操作。

由于以前没有遇到包被锁的情况,所以也没太注意这方面的技术,网上好像也很少相关的信息。当开发找到我的时候 确实也琢磨了好一阵子。

然后又从网上查到一些相关的信息,最后结合,解决问题。这里吧解决方法写下来,供参考!

如有更好的方法,欢迎大神指导学习!!欢迎拍砖

锁表的信息属于dml锁,在v$locked_object中,

但所包的信息属于ddl锁,在dba_ddl_locks中,

首先查找那个进程锁住了该对象,以下是操作过程

sql> Select b.SID,b.SERIAL#   From dba_ddl_locks a, v$session b  Where a.session_id = b.SID    And a.name = ‘xxx包名‘ AND OWNER=‘登陆用户‘;

SID    SERIAL#

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

249 27744

255 10572

70 49021

39  9881

220  1101

32 33362

290   828

264 36682

266 34873

93 41887

193 63309

115 46955

186 20919

84  2125

62 57709

41 21572

320 58450

285 14303

133 38681

221 32723

39  9881

220  1101

193 63309

115 46955

62 57709

133 38681

221 32723

27 rows selected.

好多信息,这个时候本来可以直接执行

Select spid, osuser, s.program   From v$session s, v$process p  Where s.paddr = p.addr    And s.sid = (sid);

找到相关sid的spid。然后执行kill -9 spid 或者执行

alter system kill session ‘sid,serial#‘

kill掉进程就可以了,但是一个数据库上面与很多链接用户,都在做同一件事情,你不可以吧其他正常的进程也给kill了吧

显然是不可能的。

如果是这样的情况,你可以直接查找到链接客户端机器锁开启的所有进程,kill掉,避免乱杀无辜!

确认该用户的包是否存在

select * From all_objects where owner=‘登陆用户‘and object_type = ‘PACKAGE‘   确实存在。其实这步这里可以不做每应该在最前面做,可以看看包的信息-----

终极方法,对锁表和所包应该够有效果

一般开发都是客户端连接数据库服务器。所以查到该用户在当前数据库下的所有会话,记得连客户端的计算机名都查出来,避免乱杀

涉及到数据数据我就不多截图了

sys> select saddr,sid,serial#,username,MACHINE from v$session order by username desC;

SADDR                  SID           SERIAL#      USERNAME                MACHINE

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

B54R8510                71          27377          DB1

B5659D50                319            1           DB1

B54A3B28                 32        37270           xxxx                  user-b4b16aa573

这样就可以看到该计算机连接到数据库的所有进程了

现在就可以执行

alter system kill session ‘32,37270‘;

执行后再查看

sys> select saddr,sid,serial#,username,MACHINE from v$session order by username desC;

已经没有该客户端的进程了!!搞定

欢迎拍砖哈!!!

原文:http://www.cnblogs.com/xiaoL/p/4702972.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值