大話Oracle中的kill session
在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,比如:
如果去評估KILLED狀態的session還要多少時間才能消失呢?我們可以查詢v$transcation中的USED_UBLK,比如used_ublks當前值為500,1分鐘後剩下400,那麼你可以估計該session大概還需要400/(500-400)=4分鐘的時間才能結束,以下是一個實際中的例子:
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;2. KILLED狀態的session還要多少時間才能消失?
SID STATUS
--------------- ----------
524 KILLED
如果去評估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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【會話】Oracle kill session系列會話OracleSession
- Oracle中Kill sessionOracleSession
- Oracle中Kill session的研究OracleSession
- Oracle中Kill session [轉]OracleSession
- Oracle中Kill session的研究 for oracle -- 轉OracleSession
- Oracle kill sessionOracleSession
- 【kill session】Oracle 徹底 kill session(轉載)SessionOracle
- Oracle kill session scriptOracleSession
- oracle_kill_sessionOracleSession
- Oracle批量kill sessionOracleSession
- Oracle中的Session kill不釋放問題OracleSession
- Oracle 徹底 kill sessionOracleSession
- 批量kill殺死某些會話session的plsql會話SessionSQL
- 輕鬆接觸Oracle資料庫中的Kill sessionOracle資料庫Session
- kill sessionSession
- Oracle kill session相關問題(上)OracleSession
- Oracle kill session相關問題(下)OracleSession
- Kill session 和orakill 殺會話及程式總結Session會話
- awk -- kill sessionSession
- kill session的學問Session
- kill session的測試Session
- Oracle 會話(Session)Oracle會話Session
- ORACLE快速徹底Kill掉的會話Oracle會話
- Alter system kill session and ORA-00031: session marked for killSession
- ora-00031:session marked for kill處理oracle中殺不掉的鎖SessionOracle
- disconnect session和kill session的區別Session
- Oracle kill會話--sed修改檔案Oracle會話
- mysql批次kill sessionMySqlSession
- alter system kill sessionSession
- KILL SESSION 相關Session
- OB運維 | 連線 kill 中的 session_id運維Session
- ORA-00031:session marked for kill處理oracle中殺不掉鎖的程式SessionOracle
- disconnect session和kill session的區別 轉Session
- 無腦批量kill sessionSession
- 表鎖定,kill sessionSession
- oracle session(會話) 跟蹤OracleSession會話
- 要 kill session 例子,session多,報錯如下Session
- 根據v$session 之status及logon_time有選擇kill某些session會話SessionGo會話