大話Oracle中的kill session

Jujay發表於2011-10-09
在Oracle的日常維護中,經常出現以下兩種情況需要我們DBA kill session:
1. App抱怨他們的應用hang住了,在資料庫裡查詢得知他們的session被其它session block,此時要把其它session kill掉,以便App應用能及時跑完。
2. App的應用跑到一半,突然決定不跑了,需要DBA把他們的session kill掉。
以下是我經常採用的kill session的方法:
1. 在資料庫層面用語句alter system kill 'sid, serial#'
2. 在某些特殊情況下,方法1無法使用,便在OS層面執行kill -9
採用以上方法經常碰到的問題是:對於那些已經跑了很久的session,不是一下子就能kill掉的,有時要等很久,此時就只能傻傻的在那等,當App那邊的人問“session消失了嗎?如果沒有消失,還要等多久?”等等之類的問題的時候,總是無法給他們確切的答案,直到今天看了Ask tom裡的一篇文章後,才找到解決方法。
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4974573906087

1. alter system kill 'sid, serial#'這條語句會做什麼?
每當執行以下語句時:
A105024@O02DMS1>alter system kill session '524,24148';

System altered.

總是能很快的返回System altered的結果,很多人誤以為此時session已經被killed了,其實不然,該語句只是發出一個命令,告訴這個session:你被killed掉了,如果此時session為空閒狀態,它可以馬上結束,但是如果此時session正在做一個事務,它在結束前需要將事務回滾,並釋放鎖。

因此,對於那些需要長時間回滾才能被kill掉的session來說,在執行alter system kill session之後,它的狀態變成KILLED,比如:
select username, status from v$session where sid= 524;

SID STATUS
--------------- ----------
524 KILLED
2. KILLED狀態的session還要多少時間才能消失?
如果去評估KILLED狀態的session還要多少時間才能消失呢?我們可以查詢v$transcation中的USED_UBLK,比如used_ublks當前值為500,1分鐘後剩下400,那麼你可以估計該session大概還需要400/(500-400)=4分鐘的時間才能結束,以下是一個實際中的例子:
select used_ublk from v$transaction;

USED_UBLK
----------
2262

1 row selected.

SQL> /

USED_UBLK
----------
1430

1 row selected.

SQL> /

USED_UBLK
----------
1103

1 row selected.

一直監控USED_UBLK的值,只要它不等於0,該session還是處於KILLED的狀態:

select username, status from v$session where sid= 524;

SID STATUS
--------------- ----------
524 KILLED

select used_ublk from v$transaction;

USED_UBLK
----------
1048

1 row selected.

SQL> /

USED_UBLK
----------
489

1 row selected.

SQL> /

no rows selected

沒有USED_UBLK返回,說明回滾已經結束。

3.為什麼USED_UBLK的值已經為0了,session還是顯示killed的狀態?

這是因為必需得等到client端收到ORA-00028錯誤之後,session才會消失,換句話說,即使session已經回滾完畢,但如果client端還沒有確認,session還是保持在killed的狀態,如:

select used_ublk from v$transaction;

no rows selected

雖然USED_UBLK已經為0了,但是session還是killed的狀態:

select username, status from v$session where sid= 524;

SID STATUS
--------------- ----------
524 KILLED

在client端,嘗試任何執行語句,都會出現ORA-00028:

SQL> select instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-00028: your session has been killed

此時session才會消失:

select username, status from v$session where sid= 524;

no rows selected

4. kill -9與alter system kill session的區別

alter system kill session的原理是讓session自己把自己kill掉,也就是session自己回滾;而kill -9是讓pmon清理session。
kill -9的速度看起來比alter system kill session要快一些,這是因為pmon會做一些並行的處理,讓回滾更快一些,
但是kill -9不建議使用,因為:
1. 在OS層面直接kill程式,存在未知的風險;
2. 容易誤操作,如果萬一把Oracle的關鍵程式(如smon)kill掉,會造成資料庫當機的事故;
3. 無法監控事務回滾進度。
所以,不到萬不得已的情況下,儘量不要用kill -9。

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

相關文章