日期:2014-05-16  浏览次数:20350 次

更新ORACLE数据时遇到锁死情况的处理

我们在操作数据库的 时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以查询现在存在的会话,但是我们很难找到那个会话被锁定了,想找到所以被锁的 会话就更难了。

下面是我自己通过网上的资料结合现场环境尝试过有效的杀进程解锁的过程,比较简单,容易操作:

查看被锁的表:

SELECT p.spid,
      c.object_name,
      b.session_id,
      a.serial#,
      b.oracle_username,
      b.os_user_name
 FROM v$process p, v$session a, v$locked_object b, all_objects c
 WHERE p.addr = a.paddr
  AND a.process = b.process
  AND c.object_id = b.object_id;

将查询出来的session_id,serial#,记录下来使用如下语句进行解锁

解锁:
alter system kill session'b.session_id,a.serial#';


如果解锁不成功可以尝试在操作系统层面进行进程结束(威力很大,慎用)

[Windows]  ntsd -c q -pp.spid
[Linux]        ps -ef|grepp.spid

在linux中杀系统进程的时候先试试直接KILL,有些时候无效的情况尝试kill -9 spid

本人遇到了好几次此类情况都是用以上方法解决了,目前还未遇到无效的。

希望对各位有帮助。