一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。
現在提供一種方法解決這種問題,那1.就是在ORACLE中殺不掉的,2.在OS一級再殺。
1.下面的語句用來查詢哪些對象被鎖:
select a.object_name,a.object_type,s.osuser,s.username,s.status,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s ,all_objects a
where l.object_id = o.object_id and l.session_id=s.sid and a.object_id=l.OBJECT_ID
?
?
?
object_name: 被鎖的對象名;object_type: 對象類型; osuser:主機名稱; username:oracle鏈接用戶名;
machine:完整主機名;
?
1.2 查詢可能出現鎖表的語句(orale10g支持正則)
?
?
2.下面的語句用來殺死一個進程:
alter system kill session '24,111'; (其中24,111分別是上面查詢出的sid,serial#)
【注】以上兩步,可以通過Oracle的管理控制臺來執行。
3.如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在os一級再殺死相應的進程(
線程
),首先執行下面的語句獲得進程(線程)號:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 (24是上面的sid)
4.在OS上殺死這個進程(線程):
1)在unix上,用root身份執行命令:
#kill -9 12345(即第3步查詢出的spid)
2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,語法為:
orakill sid thread
其中:
sid:表示要殺死的進程屬于的實例名
就是你安裝的oracle的sid名字如我的是 orcl
thread:是要殺掉的線程號,即第3步查詢出的spid。
例:c:>orakill orcl 12345
====================================
Oracle中Kill session的研究
alter?system?kill?session?’sid,serial#’?;?
?
被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.
我們發現當一個session被kill掉以后,該session的paddr被修改,如果有多個session被kill,那么多個session的paddr都被更改為相同的進程地址:
SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;
SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542B70E8?EYGLE??????????????????????????INACTIVE
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE
SQL>?alter?system?kill?session?’11,314’;
System?altered.
SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;
SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542D6BD4?EYGLE??????????????????????????KILLED
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE
SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;
SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542D6BD4?EYGLE??????????????????????????KILLED
542E2AA4?????????14????????397?542B7498?EQSP???????????????????????????INACTIVE
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE
SQL>?alter?system?kill?session?’14,397’;
System?altered.
SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;
SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542D6BD4?EYGLE??????????????????????????KILLED
542E2AA4?????????14????????397?542D6BD4?EQSP???????????????????????????KILLED
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE
在這種情況下,很多時候,資源是無法釋放的,我們需要查詢spid,在操作系統級來kill這些進程.但是由于此時v$session.paddr已經改變,我們無法通過v$session和v$process關聯來獲得spid那還可以怎么辦呢?
我們來看一下下面的查詢:
??SQL>?SELECT?s.username,s.status,
??2??x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
??3??decode(bitand?(x.ksuprflg,2),0,null,1)
??4??FROM?x$ksupr?x,v$session?s
??5??WHERE?s.paddr(+)=x.addr
??6??and?bitand(ksspaflg,1)!=0;
USERNAME???????????????????????STATUS???ADDR???????KSLLAPSC???KSLLAPSN?KSLLASPO???????KSLLID1R?KS?D
------------------------------?--------?--------?----------?----------?------------?----------?--?-
????????????????????????????????????????542B44A8??????????0??????????0???????????????????????0
???????????????????????????????ACTIVE???542B4858??????????1?????????14?24069?????????????????0????1
???????????????????????????????ACTIVE???542B4C08?????????26?????????16?15901?????????????????0????1
???????????????????????????????ACTIVE???542B4FB8??????????7?????????46?24083?????????????????0????1
???????????????????????????????ACTIVE???542B5368?????????12?????????15?24081?????????????????0????1
???????????????????????????????ACTIVE???542B5718?????????15?????????46?24083?????????????????0????1
???????????????????????????????ACTIVE???542B5AC8?????????79??????????4?15923?????????????????0????1
???????????????????????????????ACTIVE???542B5E78?????????50?????????16?24085?????????????????0????1
???????????????????????????????ACTIVE???542B6228????????754?????????15?24081?????????????????0????1
???????????????????????????????ACTIVE???542B65D8??????????1?????????14?24069?????????????????0????1
???????????????????????????????ACTIVE???542B6988??????????2?????????30?14571?????????????????0????1
USERNAME???????????????????????STATUS???ADDR???????KSLLAPSC???KSLLAPSN?KSLLASPO???????KSLLID1R?KS?D
------------------------------?--------?--------?----------?----------?------------?----------?--?-
SYS????????????????????????????ACTIVE???542B6D38??????????2??????????8?24071?????????????????0
????????????????????????????????????????542B70E8??????????1?????????15?24081???????????????195?EV
????????????????????????????????????????542B7498??????????1?????????15?24081???????????????195?EV
SYS????????????????????????????INACTIVE?542B7848??????????0??????????0???????????????????????0
SYS????????????????????????????INACTIVE?542B7BF8??????????1?????????15?24081???????????????195?EV
16?rows?selected.
?
我們注意,紅字標出的部分就是被Kill掉的進程的進程地址.
簡化一點,其實就是如下概念:
SQL>?select?p.addr?from?v$process?p?where?pid?<>?1?2?minus?3?select?s.paddr?from?v$session?s;
ADDR
--------
542B70E8
542B7498
?
Ok,現在我們獲得了進程地址,就可以在v$process中找到spid,然后可以使用Kill或者orakill在系統級來殺掉這些進程.實際上,我猜測:當在Oracle中kill?session以后,?Oracle只是簡單的把相關session的paddr?指向同一個虛擬地址.此時v$process和v$session失去關聯,進程就此中斷.然后Oracle就等待PMON去清除這些Session.所以通常等待一個被標記為Killed的Session退出需要花費很長的時間.如果此時被Kill的process,重新嘗試執行任務,那么馬上會收到進程中斷的提示,process退出,此時Oracle會立即啟動PMON來清除該session.這被作為一次異常中斷處理.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
