網路問題或客戶端異常可能導致資料庫會話處於僵死狀態

yangtingkun發表於2007-02-25

最近一段時間,系統的網路不是很穩定,經常發現資料庫上出現一些異常的會話,會話佔用較大的系統資源。


簡單模擬了一下,在資料庫上建立了測試用表,然後在客戶端上執行一個時間較長的SQL

SQL> CREATE TABLE T1 AS SELECT * FROM DBA_OBJECTS;

表已建立。

SQL> CREATE TABLE T2 AS SELECT * FROM DBA_TABLES;

表已建立。

SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM T1, T2;

COUNT(*)
----------
190307720

已用時間: 00: 00: 28.57

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;

SID
----------
16

已用時間: 00: 00: 00.01

再次執行這個SQL語句,在SQL語句開始執行且未完成之前,斷開客戶端和伺服器直接的網路連線,並在伺服器端觀察資料庫中相應的SESSION的等待資訊:

SQL> select sid, seconds_in_wait, event from v$session_wait where sid = 16;

SID SECONDS_IN_WAIT EVENT
---------- --------------- ---------------------------------------
16 195 SQL*Net message from client

SQL> select sid, seconds_in_wait, event from v$session_wait where sid = 16;

SID SECONDS_IN_WAIT EVENT
---------- --------------- ---------------------------------------
16 224 SQL*Net message from client

SQL> select spid from v$session s, v$process p where s.paddr = p.addr and sid = 16;

SPID
------------
13741

從作業系統上檢查程式,也會看到這個程式:

$ ps -ef|grep 13741
oracle 13741 1 8 17:13 ? 00:00:26 oracletest2 (LOCAL=NO)
oracle 13881 13849 0 17:18 pts/4 00:00:00 grep 13741

這種僵死的會話會佔用資源,而且Oraclepmon程式不會自動清除該程式,而且,如果這個會話在異常中止之前(比如客戶端異常關機或網路異常)還執行了DML操作,並且沒有回滾,那麼這個僵死會話可能對導致大量的其他會話因無法獲取資源而掛起。

DBA應該注意隨時監控系統,尤其是網路不穩定的情況下,檢查是否有類似的情況產生。在伺服器上的sqlnet.ora檔案中設定SQLNET.EXPIRE_TIME來檢測伺服器和客戶端的連線是否異常中止。不過這個設定可能會對網路效能帶來少量的下降。

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

相關文章