ITPub博客

首页 > 数据库 > Oracle > 查找并删除Oracle中等待的锁

查找并删除Oracle中等待的锁

原创 Oracle 作者:uuxa 时间:2008-05-28 21:32:05 0 删除 编辑

找到等待的锁:

1.正在等待别人的用户:

SELECT a.SID, a.serial#, a.machine, a.last_call_et, a.username, b.id1
FROM (SELECT a.username, a.SID, a.serial#, a.lockwait, a.machine, a.status,
a.last_call_et, a.sql_hash_value, a.program
FROM v$session a
WHERE NVL (a.username, 'NULL') < > 'NULL') a,
(SELECT id1, kaddr, SID, request, TYPE
FROM v$lock) b
WHERE a.lockwait = b.kaddr

2.被等待的用户

[@more@]

SELECT a.SID, a.serial#, a.machine, a.last_call_et, a.username, b.TYPE,
a.status, b.id1
FROM (SELECT a.username, a.SID, a.serial#, a.lockwait, a.machine, a.status,
a.last_call_et, a.sql_hash_value, a.program
FROM v$session a
WHERE NVL (a.username, 'NULL') < > 'NULL') a,
(SELECT id1, kaddr, SID, request, TYPE
FROM v$lock) b
WHERE b.id1 IN (
SELECT DISTINCT e.id1
FROM (SELECT a.username, a.SID, a.serial#, a.lockwait,
a.machine, a.status, a.last_call_et,
a.sql_hash_value, a.program
FROM v$session a
WHERE NVL (a.username, 'NULL') < > 'NULL') d,
(SELECT id1, kaddr, SID, request, TYPE
FROM v$lock) e
WHERE d.lockwait = e.kaddr)
AND a.SID = b.SID
AND b.request = 0
3.删除等待锁的方法:

首先执行脚本"正在等待别人的用户.sql" 和"被等待的用户" 来查找锁等待进程

若发现该阻塞其它用户进程的进程是正常操作中,则可通知该用户对其进行提交, 从而达到释放锁资源的目的;若为未正常操作,即,其状态为"inactive",且其last_call_et已为较多长时间,则可执行以下语句将该进程进行清除:

alter system kill session 'sid, serial#'

说明: alter语句后面是一个包含sid和serial#的串,
在真正删除会话时,可以使用脚本"被等待的用户.sql"和"正在等待别人的用户.sql"来得到想要删除的sid和serial#组合

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7416120/viewspace-1004786/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    111
  • 访问量
    301518