ORACLE DCD(dead connection detection)特性

DCD介紹:

主要用於客戶端因異常與DB斷鏈,造成原先的連接不可用,oracle會檢測連接,若檢查到異常,將該些連接清除。sqlnet.ora文件中的expire_time指定檢測間隔時間

 

DCD原理:

當一個新的數據庫連接建立後,DCD會爲這個連接創建一個定時器,當該定時器到達指定時間間隔後,就會向客戶端發送一個probe package(偵測包),該包實質上是一個空的SQL*NET包,不包括任何有用數據。如果此時客戶端連接還是正常的話,那麼這個probe package就會被客戶端直接丟棄,然後Oracle服務器就會把該連接對應的定時器重新復位。如果客戶異常退出的話,偵測包由客戶端的IP層交到TCP層時,就會發現原先的連接已經不存在了,然後TCP層就會返回錯誤信息,該信息被Oracle服務端接收到後,Oracle就會知道該連接已經不可用了,於是SQL*NET就會向操作系統發送消息,釋放該連接資源。

 

問題案例:客戶端無法連接數據庫;

初步檢查:

查詢V$process中連接數同數據庫中配置的連接數上限近一致

但查看連接DB的應用程序的當前佔用連接池總數是小於DB視圖v$process中的數量

故判斷可能存在大量連接未釋放所導致

 

模擬測試:

當前有一個AS連接到當前DB,將該AS連接池連接數設置爲10,啓動應用

在DB上netstat將發現有10條來自AS的連接

此時拔掉AS的網線,將查到10條連接都未釋放

再連上網線,又多了10條連接,共20條了;

【原因分析】oracle不會將已斷掉的連接自動釋放,儘管pmon會定時清理這些連接,但pmon執行週期並不固定,故這些無用連接會長時間佔用oracle的連接資源,導致新的連接無法建立

 

解決辦法:

修改$ORACLE_HOME/network/admin/sqlnet.ora文件中expire_time參數(單位分鐘)

修改完後無需重啓ORACLE,對所有新連接會自動生效,舊連接不起作用

【注】確認DCD已啓用,要把參數TRACE_LEVEL_SERVER、TRACE_DIRECTORY_SERVER去除,否則產生大量trace,影響性能

 

模擬測試:將AS網線拔掉,超過1分鐘後,在DB上netstat,發現原先連接仍未釋放,trace文件生成了,說明sqlnet修改生效但爲何未清除連接?

根據DCD原理,網絡正常情況下,sqlnet會在規定時間內清除無用連接,但網絡中斷,就如該問題,這又涉及網絡方面基礎,TCP/IP有超時重傳機制,當網絡包發送超出一定時間沒有響應,發送端認爲網絡異常,未到目的地,所以固定週期後反覆重發,當達到重發最大次數若還未成功,則放棄發送,這個週期很長,故出現了上述問題

修改測試:將AS網線拔掉,等待幾秒,當AS出現sql連接異常報錯時,連上網線,恢復DB連接,在DB上查看舊連接仍爲釋放,等待1分鐘後再查看,舊連接將被釋放;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章