【ORACLE】查看死鎖進程並結束死鎖的腳本


--共享鎖:Share;排他鎖:Exclusive;行共享鎖:Row-S;行排他鎖:Row-X
select   V$SESSION.sid,v$session.SERIAL#,v$process.spid,   
  rtrim(object_type)   object_type,rtrim(owner)   ||   '.'   ||   object_name   object_name,   
  decode(lmode,       0,   'None',   
  1,   'Null',   
  2,   'Row-S',   
  3,   'Row-X',   
  4,   'Share',   
  5,   'S/Row-X',   
  6,   'Exclusive', 'Unknown')   LockMode,   
  decode(request,   0,   'None',   
  1,   'Null',   
  2,   'Row-S',   
  3,   'Row-X',   
  4,   'Share',   
  5,   'S/Row-X',   
  6,   'Exclusive',   'Unknown')   RequestMode   
  ,ctime,   block   b,   
  v$session.username,MACHINE,MODULE,ACTION,   
  decode(A.type,   
  'MR',   'Media   Recovery',   
  'RT','Redo   Thread',   
  'UN','User   Name',   
  'TX',   'Transaction',   
  'TM',   'DML',   
  'UL',   'PL/SQL   User   Lock',   
  'DX',   'Distributed   Xaction',   
  'CF',   'Control   File',   
  'IS',   'Instance   State',   
  'FS',   'File   Set',   
  'IR',   'Instance   Recovery',   
  'ST',   'Disk   Space   Transaction',   
  'TS',   'Temp   Segment',   
  'IV',   'Library   Cache   Invalida-tion',   
  'LS',   'Log   Start   or   Switch',   
  'RW',   'Row   Wait',   
  'SQ',   'Sequence   Number',   
  'TE',   'Extend   Table',   
  'TT',   'Temp   Table',   
  'Unknown')   LockType   
  from   (SELECT   *   FROM   V$LOCK)   A,   all_objects, V$SESSION, v$process   
  where   A.sid   >   6   
  and   object_name<>'OBJ$'   
  and   A.id1   =   all_objects.object_id   
  and   A.sid=v$session.sid   
  and   v$process.addr=v$session.paddr; 

--查看鎖表進程SQL語句1: 
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode 
from v$locked_object lo, dba_objects ao, v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid; 

--殺掉鎖表進程: 
--如有記錄則表示有lock,記錄下SID, serial# ,將記錄的ID替換下面的1143,24155,即可解除LOCK 
alter system kill session '1143,24155'; 
SELECT Saddr, Sid, Serial#, Paddr, Username, Status FROM V$session t WHERE t.SID = '1143';

--查看機器鎖定代碼對象
select b.sid,b.serial#,b.machine,b.terminal,b.program,b.process,b.status from v$lock a , v$session b
where a.SID = b.SID and b.MACHINE='guoshaoyue-5040';

--用這個可以查(可以查看哪台機器哪個用戶鎖了記錄, 其中command是用來殺掉鎖住記錄的session ):
select s.sid,s.machine,o.object_name,l.oracle_username,l.locked_mode, 'ALTER  SYSTEM  KILL  SESSION  '''||s.sid||',  '||s.serial#||''';' Command
from  v$locked_object  l,v$session  s,all_objects  o  where  l.session_id=s.sid  and  l.object_id=o.object_id; 

--同樣也是通過寫sql從數據字典里查出來。 
-- SELECT-SQL1 功能:檢查被加鎖的對象 
select obj.OWNER||'.'||obj.OBJECT_NAME as OBJ_NAME, --// 對象名稱(已經被鎖住) 
   obj.SUBOBJECT_NAME as SUBOBJ_NAME,     --// 子對象名稱(已經被鎖住) 
   obj.OBJECT_ID as OBJ_ID,        --// 對象ID 
   obj.OBJECT_TYPE as OBJ_TYPE,       --// 對象類型 
   lock_obj.SESSION_ID as SESSION_ID,     --// 會話SESSION_ID 
   lock_obj.ORACLE_USERNAME as ORA_USERNAME,  --// ORACLE系統用戶名稱 
   lock_obj.OS_USER_NAME as OS_USERNAME,    --// 操作系統用戶名稱 
   lock_obj.PROCESS as PROCESS       --// 進程編號 
from 
  ( select * from all_objects where object_id in (select object_id from v$locked_object)) obj, 
  v$locked_object lock_obj 
where obj.object_id=lock_obj.object_id; 

-- SELECT-SQL2 功能:檢查被加鎖的對象以及加鎖的會話信息 
-- ALTER-SQL1 功能:殺死會話(SESSION_ID,SERIAL#),可以手工解除鎖 
-- 請手工修改SESSION_ID,SERIAL#為相應值 
-- 注意:本功能慎重使用,有一定的破壞性,該SQL可以斷開客戶機和服務器的連接 
-- ALTER SYSTEM KILL SESSION 'SESSION_ID,SERIAL#';
select LOCK_INFO.OWNER||'.'||LOCK_INFO.OBJ_NAME as OBJ_NAME, --// 對象名稱(已經被鎖住) 
   LOCK_INFO.SUBOBJ_NAME as SUBOBJ_NAME,       --// 子對象名稱(已經被鎖住) 
   SESS_INFO.MACHINE as MACHINE,         --// 機器名稱 
   LOCK_INFO.SESSION_ID as SESSION_ID,       --// 會話SESSION_ID 
   SESS_INFO.SERIAL# as SERIAL#,         --// 會話SERIAL# 
   LOCK_INFO.ORA_USERNAME as ORA_USERNAME,      --// ORACLE系統用戶名稱 
   LOCK_INFO.OS_USERNAME as OS_USERNAME,       --// 操作系統用戶名稱 
   LOCK_INFO.PROCESS as PROCESS,         --// 進程編號 
   LOCK_INFO.OBJ_ID as OBJ_ID,          --// 對象ID 
   LOCK_INFO.OBJ_TYPE as OBJ_TYPE,         --// 對象類型 
   SESS_INFO.LOGON_TIME as LOGON_TIME,       --// 登錄時間 
   SESS_INFO.PROGRAM  as PROGRAM,         --// 程序名稱 
   SESS_INFO.STATUS as STATUS,          --// 會話狀態 
   SESS_INFO.LOCKWAIT as LOCKWAIT,         --// 等待鎖 
   SESS_INFO.ACTION as ACTION,          --// 動作 
   SESS_INFO.CLIENT_INFO as CLIENT_INFO       --// 客戶信息 
 
from 
 ( 
  select obj.OWNER as OWNER, 
     obj.OBJECT_NAME as OBJ_NAME, 
     obj.SUBOBJECT_NAME as SUBOBJ_NAME, 
     obj.OBJECT_ID as OBJ_ID, 
     obj.OBJECT_TYPE as OBJ_TYPE, 
     lock_obj.SESSION_ID as SESSION_ID, 
     lock_obj.ORACLE_USERNAME as ORA_USERNAME, 
     lock_obj.OS_USER_NAME as OS_USERNAME, 
     lock_obj.PROCESS as PROCESS 
  from 
   ( select * from all_objects where object_id in (select object_id from v$locked_object)) obj, 
   v$locked_object lock_obj 
  where obj.object_id=lock_obj.object_id 
 )  LOCK_INFO, 
 ( 
  select SID, 
     SERIAL#, 
     LOCKWAIT, 
     STATUS, 
     PROGRAM, 
     ACTION, 
     CLIENT_INFO, 
     LOGON_TIME, 
     MACHINE 
  from v$session 
 ) SESS_INFO 
where LOCK_INFO.SESSION_ID=SESS_INFO.SID ; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM