2014-05-13 66 views
1

好時機。客戶端異常關機時的Oracle活動會話狀態

幾天前,我們的數據庫團隊發現,對於不再活動的客戶端,會話處於'ACTIVE'狀態。一項調查顯示,有這樣的問題,兩個主要來源:

  1. 遠程SQL Developer的連接(實際上,這種情況下是不是很有趣),
  2. 異常的Tomcat(其中我們的應用程序正在運行)停機(如' kill -9')

對我而言,所有會話都處於'ACTIVE'狀態是很奇怪的。請問有人可以澄清這是怎麼回事(也許有一些底層進程在相應的套接字上等待着,或者......只要在適當的tomcat關閉時一切正常,這似乎是事務的根本原因。 ..)?

如果我們爲'所有連接'和'EXPIRE_TIME'(對於我們所有的RAC實例)設置'IDLE_TIME'會有幫助嗎?

我是正確的,在下列情況下應採取的地方(與設置上述參數):

  1. 當客戶端連接它會被標記爲「有效」
  2. 沒有對於「ACTIVE '狀態,有一個'ping'過程,由'ping'客戶端的'EXPIRE_TIME'參數產生。
  3. 如果在EXPIRE_TIME時間段內ping過程失敗,即使會話爲「ACTIVE」,會話也會被oracle終止。
  4. 如果客戶端在ping響應但沒有進行任何處理,則在IDLE_TIME時間段之後,會話變爲'INACTIVE'並且(如果'IDLE_TIME'參數被設置)在一段時間之後 - 'SNIPED'。之後,「SMON」流程開始本次會議的管家活動(以及其他具有「SNIPED」狀態的活動)。

UPDATE

似乎只有這樣,纔能有這樣的情況下工作是配置Oracle實例。 有我的調查結果:

  • https://community.oracle.com/thread/873226?start=0&tstart=0

    死連接檢測用於服務器端sqlnet.ora文件 參數SQLNET.EXPIRE_TIME = <#分鐘>

    的其他選項將在配置文件設置中實現idle_time。然後用一些工作殺掉SNIPED會話(當idle_time將達到 時,會話將從INACTIVE變爲SNIPED)。


    如果我打開一個連接,並走下車來的午餐,一個IDLE_TIME限制將導致 閒置15分鐘後,將被終止我的會議。 15分鐘的EXPIRE_TIME只會讓Oracle向我的 客戶端應用程序發送數據包,以驗證客戶端沒有失敗。如果 客戶端時,它會回答ping和我的會議將呆在身邊 下去。的expire_time不僅會導致如果 客戶端應用程序無法響應ping,這意味着 客戶端進程已經失敗,或者客戶端系統已失敗的會話被殺害。 IDLE_TIME會終止在 時間段內沒有任何活動的會話,但通常不會與 維護連接池的應用程序正常工作,因爲假設連接池的公平號碼那是一天的時間,並自認爲使用連接池 往往很差反應池中連接被殺的應用閒置 連接。

  • https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212

    TCP/IP默認情況下不中斷的事情,通過設計。當連接消失時,客戶端和/或服務器不會立即通知 。所以,如果您的客戶端連接到數據庫,所以沒有任何 和您拔的客戶端(藍屏它,殺死它,拔出網線,使計算機崩潰,等等)的賠率是會話 將留在數據庫中。服務器將不會知道它永遠不會收到你的消息 。我們有,如果 它成爲一個問題死了客戶端檢測:

    http://download.oracle.com/docs/cd/B12037_01/network.101/b10776/sqlnet.htm#sthref476

    對於活動會話,這是很容易的。您打開一個連接, 您通過此連接提交請求,如「鎖定表T」。表t 已被您的會話中的交易鎖定。然後,您提交一個塊 的代碼,如:

    開始循環DBMS_LOCK.SLEEP(5);末端迴路;結束;/

    您的會議將是隻要該代碼運行的活動 - 在 客戶端進程被阻止一個套接字上讀等待服務器 發回的結果 - 響應(這當然永遠也不會到來) 。 服務器現在完全沒有觸及網絡 - 它與 代碼處於激活狀態。所以,如果你的客戶「死」,現在 - 的代碼 塊將繼續運行,並運行,運行 - 而且,因爲它從來不提交 - 它會只是掛在那裏,並運行,當然,你有任何鎖將保留 。

  • http://www.databaseskill.com/4267817/

  • http://www.dba-oracle.com/t_connect_time_idle_expire_timeout.htm

    的sqlnet.expire_time參數用於設定一時間間隔,在 分鐘,以確定探針應該如何經常被髮送驗證 客戶/服務器連接是活動的。如果您需要確保 連接不會無限期地斷開(或直到 由操作系統特定的參數設置的時間),您應該設置一個大於0的值爲 。這可以保護系統免受連接打開 由於客戶端異常終止。

  • https://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:453256655431

    如果會話等待資源的鎖或插銷,即使會話,如果這 等待時間超過IDLE_TIME設定個剖面,並在會議 被狙擊,在交易的中間, 等待鎖等

    如果是這樣,就會出現在警報日誌中的任何條目。

    跟進

    如果等待鎖,你是積極的 - 沒有閒着。


    這些網頁吸引我的注意,六月份前我有一個數據保護問題的Oracle支持 ,所以甲骨文的球員之一,請注意我用 的IDLE_TIME,他告訴我,這個參數不要工作得很好 因爲Oracle不釋放被標記 爲剪斷會話的資源,直到下一次用戶嘗試使用它(等待 告訴你的會話被殺,清除會話資源)

    跟進

    ...經過調查......「會話」是存在的,這 不會消失,直到客戶端確認它,但 「交易」已經一去不復返了。


    湯姆,我已經改變的輪廓具有IDLE_TIME = 240(4小時),並取得 確保我RESOURCE_LIMIT參數設置爲TRUE。當我查詢 V $會議上,我看到一些「剪掉」的會議,而且還 已閒置超過一天「無效」的。所有這些用戶都將這個檔案 分配給他們。如果用戶會話在idle_time 設置之前已連接,那麼這些會話是否會受到此更改的影響?前段時間我有 發生了變化。還有什麼我應該 已經做了?

    跟進

    如果IDLE_TIME設置之前,用戶會話連接, 他們是在「祖父」 - 他們不會被狙擊。它只有 影響新會話。

  • http://agstamy.blogspot.ru/2011/03/profile-and-resource-limit.html

  • 額外的東西,並建議:https://rebby.com/blog.php?detail=32
+0

嗨,你使用哪種連接?專用或共享(或合併)?共享服務器存在一些錯誤。我們遇到了這個錯誤。 Oracle不會看到活動客戶端的斷開連接並繼續查詢。他們只是發給我們一個補丁來糾正它 – eliatou

+1

你好,eliatou。我們使用聯合連接,但詳細瞭解以上所有內容也非常有趣。請你儘可能詳細地分享有關這個問題的知識,如果可能的話,分享一個補丁。 – Dmitry

+0

我的記憶錯了。我們的錯誤是關於像你這樣的彙集連接!請參閱補丁17054981:DRCP不會終止連接 – eliatou

回答

0

我們已經檢查的參數,在上面列出的調查,一切工作正常!