帮助你解脱困扰:发现并解除ORACLE数据库死锁

        尽管Oracle的锁定机制已经够完善,但还是有很多人在数据库编程时陷入死锁之中。不要怨天尤人,仔细回顾一下你的设计模型和操作逻辑,问题就在自己身上。

下面程序可以帮助你解除死锁,以解燃眉之急。死锁发生原因在后续文章中会详细讨论。

 

@echo off
echo Author: Gmtsao      Date: 2004-10-19 17:08
echo **********************************************************
echo ****     ***  ***  **  ***  **  ***  **      **     ******
echo ****  **  **  ***  **   **  **   **  **  ******  **  *****
echo ****  **  **  ***  **    *  **    *  **  ******  **  *****
echo ****      **  ***  **       **       **      **      *****
echo ****  *  ***  ***  **  *    **  *    **  ******  *  ******
echo ****  **  **  ***  **  **   **  **   **  ******  **  *****
echo ****  ***  **     ***  ***  **  ***  **      **  ***  ****
echo **********************************************************
echo 用法:将全部文本另存为ccs.bat文件 执行 ccs.bat uid/pwd@servname 即可
echo ORACLE数据库解锁...


set args=""

if "%1"=="" goto end
set args=%1

:loop
shift
if "%1"=="" goto end
   set args=%args% %1
   goto loop

:end

if %args%=="" goto cancel

del /q c:/ckutl.cc

echo CREATE OR REPLACE PROCEDURE SYS.PRC_KILL_LOCKED(P1 NUMBER DEFAULT 0, P2 NUMBER DEFAULT 0) AS>> c:/ckutl.cc
echo   V_SID NUMBER;>> c:/ckutl.cc
echo   V_SERIAL NUMBER;>> c:/ckutl.cc
echo   V_SQL VARCHAR2(4000);>> c:/ckutl.cc
echo   TYPE CUROBJ IS REF CURSOR;>> c:/ckutl.cc
echo   CCOBJ CUROBJ;>> c:/ckutl.cc
echo -->> c:/ckutl.cc
echo BEGIN>> c:/ckutl.cc
echo   IF P1 IS NOT NULL AND P2 IS NOT NULL AND P1 != 0 AND P2 != 0 THEN>> c:/ckutl.cc
echo     V_SQL := CONCAT('ALTER SYSTEM KILL SESSION ''', P1);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, ', ');>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, P2);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, '''');>> c:/ckutl.cc
echo     EXECUTE IMMEDIATE V_SQL;>> c:/ckutl.cc
echo     RETURN;>> c:/ckutl.cc
echo   END IF;>> c:/ckutl.cc
echo   -->> c:/ckutl.cc
echo   V_SQL := 'SELECT SID,SERIAL# FROM V$SESSION WHERE SID IN (SELECT SID FROM V$LOCK)';>> c:/ckutl.cc
echo   /*>> c:/ckutl.cc
echo   V_SQL := 'select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.sid, a.serial#';>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' from v$session a, v$lock b, v$sqltext c');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' union');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.sid, a.serial#');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' from v$session a, v$lock b, v$sqltext c');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' where b.id1 in (');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, '   select /*+ NO_MERGE(d) NO_MERGE(e) */ distinct e.id1');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, '   from v$session d, v$lock e');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, '   where d.lockwait = e.kaddr');>> c:/ckutl.cc
echo   V_SQL := CONCAT(V_SQL, ' ) and a.username is not null and a.sid = b.sid and b.request=0 and c.hash_value =a.sql_hash_value');>> c:/ckutl.cc
echo   */>> c:/ckutl.cc
echo   -->> c:/ckutl.cc
echo   OPEN CCOBJ FOR V_SQL;>> c:/ckutl.cc
echo   -->> c:/ckutl.cc
echo   LOOP>> c:/ckutl.cc
echo     FETCH CCOBJ INTO V_SID, V_SERIAL;>> c:/ckutl.cc
echo     EXIT WHEN CCOBJ%%NOTFOUND;>> c:/ckutl.cc
echo     V_SQL := CONCAT('ALTER SYSTEM KILL SESSION ''', V_SID);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, ', ');>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, V_SERIAL);>> c:/ckutl.cc
echo     V_SQL := CONCAT(V_SQL, '''');>> c:/ckutl.cc
echo     EXECUTE IMMEDIATE V_SQL;>> c:/ckutl.cc
echo   END LOOP;>> c:/ckutl.cc
echo   CLOSE CCOBJ;>> c:/ckutl.cc
echo EXCEPTION>> c:/ckutl.cc
echo   WHEN OTHERS THEN>> c:/ckutl.cc
echo     NULL;>> c:/ckutl.cc
echo END;>> c:/ckutl.cc
echo />> c:/ckutl.cc
echo EXEC SYS.PRC_KILL_LOCKED>> c:/ckutl.cc
echo />> c:/ckutl.cc
echo DROP PROCEDURE SYS.PRC_KILL_LOCKED>> c:/ckutl.cc
echo />> c:/ckutl.cc
echo QUIT>> c:/ckutl.cc
echo />> c:/ckutl.cc

sqlplus %args% @c:/ckutl.cc

del /q c:/ckutl.cc

@echo on
exit

:cancel

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值