Oracle 解決鎖表問題

不一樣的天空w發表於2017-07-27
問題:更新一張表的資料,就幾百條,然後特別慢,一直在執行,然後強制退掉,重新執行還是一樣,考慮到可能是鎖表的問題!

解決:
①首先查詢是哪些session被鎖:

select object_name,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s
where l.object_id=o.object_id and l.session_id=s.sid;

查詢出來之後,發現有三個物件!
②然後將這三個物件一一殺死:

alter system kill session '13,52136';
--這裡的13是上邊查出的sid,52136是查出的serial


然後又出現了一個問題,我再查的時候那個sid為13的session還是一直在,但是狀態已經是killed,我再執行alter system kill session '13,52136';時就報錯ORA-00031:session marked for kill(標記要終止的會話)

伺服器資料庫上鎖定的資源還是沒有釋放,這時候我們可以去伺服器將該程式殺死!
首先查出程式號spid:

select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=13;   --spid=5162


然後根據查詢出的spid來殺死程式
1. Linux OS:kill -9 5162
2. Windows OS:orakill mars 5162 ,其中mars為要殺死程式的例項名!
在windows下開啟cmd,輸入命令tasklist /svc可以檢視PID為5162的服務名,即例項名!

這裡說下三個概念:

SPID一一system process id,
表示該server process在OS層面的Porcess ID ,即作業系統程式ID
PID一一Oracle process id
可以理解為Oracle自己用的,Oracle程式ID
SID一一SESSION標識,常用於連線其它列

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2142673/,如需轉載,請註明出處,否則將追究法律責任。

相關文章