我們知道
在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
E
E
C
B
E
EYGLE INACTIVE
E
B
D
SYS ACTIVE
SQL> alter system kill session
;
System altered
SQL> select saddr
sid
serial#
paddr
username
status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
E
E
C
D
BD
EYGLE KILLED
E
B
D
SYS ACTIVE
SQL> select saddr
sid
serial#
paddr
username
status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
E
E
C
D
BD
EYGLE KILLED
E
AA
B
EQSP INACTIVE
E
B
D
SYS ACTIVE
SQL> alter system kill session
;
System altered
SQL> select saddr
sid
serial#
paddr
username
status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
E
E
C
D
BD
EYGLE KILLED
E
AA
D
BD
EQSP KILLED
E
B
D
SYS ACTIVE
在這種情況下
很多時候
資源是無法釋放的
我們需要查詢spid
在操作系統級來kill這些進程
但是由於此時v$session
paddr已經改變
我們無法通過v$session和v$process關聯來獲得spid
那還可以怎麼辦呢?
我們來看一下下面的查詢:
SQL> SELECT s
username
s
status
x
ADDR
x
KSLLAPSC
x
KSLLAPSN
x
KSLLASPO
x
KSLLID
R
x
KSLLRTYP
decode(bitand (x
ksuprflg
)
null
)
FROM x$ksupr x
v$session s
WHERE s
paddr(+)=x
addr
and bitand(ksspaflg
)!=
;
USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID
R KS D
B
A
ACTIVE
B
ACTIVE
B
C
ACTIVE
B
FB
ACTIVE
B
ACTIVE
B
ACTIVE
B
AC
ACTIVE
B
E
ACTIVE
B
ACTIVE
B
D
ACTIVE
B
USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID
R KS D
SYS ACTIVE
B
D
B
E
EV
B
EV
SYS INACTIVE
B
SYS INACTIVE
B
BF
EV
rows selected
簡化一點
其實就是如下概念:
SQL> select p
addr from v$process p where pid < >
minus
select s
paddr from v$session s;
ADDR
B
E
B
現在我們獲得了進程地址
就可以在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
這被作為一次異常中斷處理
From:http://tw.wingwit.com/Article/program/Oracle/201311/11195.html