原文:https://blog.csdn.net/xyl870419/article/details/23256505
一、處理過程
1.通過查找出已被鎖定的數據庫表及相關的sid、serial#及spid:
select object_name as 對象名稱,s.sid,s.serial#,p.spid as 系統進程號
from v$locked_object l , dba_objects o , v$session s , v$process p
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;
2.在數據庫中滅掉相關session:
alter system kill session 'sid,serial#';
--sid及serial#為第一步查出來的數據
3.從系統中滅掉與該session對應的進程:
kill -9 spid;
--spid為第一步中查出來的系統進程號
經過以上操作之后重新對之前鎖定的對象進行操作應該就可以了。
二、使用了相關表的基本介紹
- V$LOCKED_OBJECT中的列說明:
XIDUSN:回滾段號
XIDSLOT:槽號
XIDSQN:序列號
OBJECT_ID:被鎖對象ID
SESSION_ID:持有鎖的sessionID
ORACLE_USERNAME:持有鎖的Oracle 用戶名
OS_USER_NAME:持有鎖的操作系統 用戶名
PROCESS:操作系統進程號
LOCKED_MODE:鎖模式
- dba_objects的列說明(網上找的,懶得翻譯了^_^)
OWNER
Username of the owner of the object
OBJECT_NAME
Name of the object
SUBOBJECT_NAME
Name of the sub-object (for example,partititon)
OBJECT_ID
Object number of the object
DATA_OBJECT_ID
Object number of the segment which contains the object
OBJECT_TYPE
Type of the object
CREATED
Timestamp for the creation of the object
LAST_DDL_TIME
Timestamp for the last DDL change (including GRANT and REVOKE) to the object
TIMESTAMP
Timestamp for the specification of the object
STATUS
Status of the object
TEMPORARY
Can the current session only see data that it place in this object itself?
GENERATED
Was the name of this object system generated?
SECONDARY
Is this a secondary object created as part of icreate for domain indexes?
- v$session的說明
V$SESSION是基礎信息視圖,用於找尋用戶SID或SADDR
常用列:
SID:SESSION標識
SERIAL#:如果某個SID又被其它的session使用的話則此數值自增加(當一個SESSION結束,另一個SESSION開始並使用了同一個SID)。
AUDSID:審查session ID唯一性,確認它通常也用於當尋找並行查詢模式
USERNAME:當前session在oracle中的用戶名。
STATUS:這列用來判斷session狀態是:
Achtive:正執行SQL語句(waiting for/using a resource)
Inactive:等待操作(即等待需要執行的SQL語句)
Killed:被標注為刪除
- v$process視圖
v$process視圖包含當前系統Oracle運行的所有進程信息。常被用於將Oracle或服務進程的操作系統進程ID與數據庫session之間建立聯系。
常用列:
ADDR:進程對象地址
PID:oracle進程ID
SPID:操作系統進程ID
詳解:
一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。但是shutdown immediate又怕可能進程殺不掉會一直停留在shutdown immediate,直接shutdown abort又怕損壞數據庫。
現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。但是shutdown immediate又怕可能進程殺不掉會一直停留在shutdown immediate,直接shutdown abort又怕損壞數據庫。
現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1.下面的語句用來查詢哪些對象被鎖:
SELECT S.USERNAME,S.OSUSER,S.SID,S.SERIAL#,P.SPID FROM V$SESSION S,V$PROCESS
P WHERE S.PADDR=P.ADDR AND S.USERNAME IS NOT NULL;
2.下面的語句用來殺死一個進程:
alter system kill session 'sid,serial#';
【注】以上兩步,可以通過Oracle的管理控制台來執行。
如果出現題目的錯誤,可以
select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED' ;
3.如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在os一級再殺死相應的進程(線程),首先執行下面的語句獲得進程(線程)號:
select spid, osuser, s.program from v$session s,v$process p where
s.paddr=p.addr and s.sid=33 (33就是上面的sid)
4.在OS上殺死這個進程(線程):
1)在unix上,用root身份執行命令:
#kill -9 12345(即第3步查詢出的spid)
2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,語法為:
orakill sid thread
其中:
sid:表示要殺死的進程屬於的實例名
thread:是要殺掉的線程號,即第3步查詢出的spid。
例:c:>orakill orcl 12345
Ps:這里要注意的是kill OS進程是在服務端操作,而不是你程序所在客戶機。