開發環境:win2000server+Oracle9i+Delphi開發人員報告:在程序中殺了JOB,但是被操作的表還是鎖表狀態, 其中有一張日志表還在不斷插入記錄, 直到執行完所有插入操作(一個漫長的等待過程)才能解鎖現場描述:oem中被殺job起的session狀態為killed,其中有3張表被鎖點擊右鍵--》中斷會話 提示: 標記要刪去的會話 ===================================================================================================處理方法一 : 1.SELECT saddr,sid,serial#,paddr,username,status FROM v$session WHERE username IS NOT NULLexample:saddr,sid,serial#,paddr,username,status FROM v$session WHERE username = 'XNJW0419' ;SADDR SID SERIAL# PADDR USERNAME STATUS -------- ---------- ---------- -------- ------------------------------ -------- 542E0E6C 11 314 542B70E8 EYGLE INACTIVE 542E5044 18 662 542B6D38 SYS ACTIVE 2.ALTER SYSTEM KILL SESSION 'sid, serial#';example:ALTER SYSTEM KILL SESSION '11,314';(注:在sqlplus中執行 ) 結果: 提示標記要刪去的會話 無法釋放會話,未成功解鎖 ====================================================================================================處理方法二 : a、 找到你要殺掉的那個SESSION, 并記下paddr SELECT sid, username, paddr, status FROM v$session WHERE username = '用戶名' ; example:SELECT sid, username, paddr, status FROM v$session WHERE username = 'XNJW0419' ; SID USERNAME PADDR STATUS---------- ------------------------------ -------- -------- 10 XNJW0419 2B5E2E2C KILLED b、 找到這個SESSION所對應的spid SELECT * FROM v$PRocess WHERE addr = '上面查尋的paddr'; example:SELECT ADDR,PID,SPID,USERNAME,SERIAL#,TERMINAL FROM v$process WHERE addr = '2B5E2E2C';ADDR PID SPID USERNAME SERIAL# TERMINAL-------- ---------- ------------ --------------- ---------- ----------------2B5E2E2C 44 1204 SYSTEM -99 JWC
c、 殺掉spid所標識的那個進程 D:/>orakill sid spid (注:cmd命令窗口中執行 只有oracle服務器端才有orakill命令)example: D:/>orakill oemrep 1204 提示:KILL OF THREAD id 1204 IN INSTANCE oemrep sUCcessfully signalled. 結果:成功刪除該SESSION,表也解鎖 一句話: --查看系統鎖 SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
s.STATUS,
s.terminal,
s.machine,
s.program,
s.osuser,
s.LOGON_TIME
FROM v$session s,
v$lock l,
dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
and s.status ='ACTIVE' 解鎖及Kill Session: 使用下面的語法查出鎖并殺掉Session。 SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID;
ALTER SYSTEM KILL SESSION 'SID,SERIAL#'; 當然在kill前最好記住問題所在然后分析從最根本的解決問題! ORAKILL為windows下面的操作命令。UNIX下面直接使用KILL -9也可以,不過建議使用ALTER SYSTEM KILL SESSION 'SID,SERIAL#'; 進行kill