Oracle之關(guān)于各類連接超時(shí)相關(guān)參數(shù)學(xué)習(xí)
最近遇到些空閑連接超時(shí)相關(guān)的問(wèn)題,查了下主要有以下與超時(shí)相關(guān)參數(shù),整理記錄含義及區(qū)別。
EXPIRE_TIME
IDLE_TIMEOUT
SESSION_TIMEOUT
INBOUND_CONNECT_TIMEOUT
- profile中的
idle_time
- profile中的c
onnect_time
一、 EXPIRE_TIME
1. 使用說(shuō)明
EXPIRE_TIME 用于死連接檢測(cè)。設(shè)定該參數(shù)為非零值,12c前會(huì)定期給空閑連接發(fā)送探測(cè)包檢查客戶端是否已異常斷開(kāi)(12c開(kāi)始則利用操作系統(tǒng)keepalive參數(shù)進(jìn)行檢測(cè))。
一旦發(fā)現(xiàn)異常連接,最多會(huì)重傳操作系統(tǒng)參數(shù)tcp_retries2指定次數(shù)。
如果超過(guò)最大重試次數(shù)仍重傳失敗,將返回錯(cuò)誤并通知oracle pmon進(jìn)程清除對(duì)應(yīng)的server process。
值得注意的是,根據(jù)文檔 Doc ID 395505.1,如果在1個(gè)SQLNET.EXPIRE_TIME之內(nèi)客戶端有數(shù)據(jù)包發(fā)送,在SQLNET.EXPIRE_TIME時(shí)間到來(lái)時(shí),oracle不會(huì)再發(fā)送探測(cè)數(shù)據(jù)包給客戶端,這樣有可能出現(xiàn)最大2*SQLNET.EXPIRE_TIME時(shí)間端內(nèi),沒(méi)有發(fā)送探測(cè)包給客戶端的情況。
比如設(shè)置sqlnet.expire_time=10,最大空閑時(shí)間則可能為2*600=1200秒,如果防火墻空閑超時(shí)為910秒,完全可能出現(xiàn)在探測(cè)包發(fā)送之前,空閑連接就已經(jīng)被斷開(kāi)的情況。
2. 使用限制
新設(shè)置參數(shù)對(duì)舊連接上不生效(It is not allowed on bequeathed connections.)
探測(cè)數(shù)據(jù)包雖然很小,卻也會(huì)產(chǎn)生額外的流量,可能降低網(wǎng)絡(luò)性能
根據(jù)操作系統(tǒng)不同,服務(wù)器可能需要執(zhí)行其他處理,以區(qū)分連接探測(cè)事件和其他事件,這也會(huì)導(dǎo)致網(wǎng)絡(luò)性能下降。
二、 IDLE_TIMEOUT
空閑超時(shí)時(shí)間。指定已建立的連接在不傳輸數(shù)據(jù)的情況下可以保持活動(dòng)狀態(tài)的時(shí)間。
Oracle默認(rèn)情況下不會(huì)關(guān)閉非活躍連接(IDLE_TIMEOUT=0),但非活躍連接過(guò)長(zhǎng)時(shí)間不退出可能導(dǎo)致連接數(shù)過(guò)高,浪費(fèi)數(shù)據(jù)庫(kù)資源。
將IDLE_TIMEOUT設(shè)置為大于0的值(單位為秒)指定會(huì)話空閑超時(shí)時(shí)間,到達(dá)超時(shí)時(shí)間后會(huì)話會(huì)被數(shù)據(jù)庫(kù)中斷。
通常防火墻會(huì)有kill空閑連接的配置,可以看看是否有必要重復(fù)設(shè)置。如果要設(shè),IDLE_TIMEOUT指定的時(shí)間應(yīng)該小于防火墻指定的空閑時(shí)間。
EXPIRE_TIME 與 IDLE_TIMEOUT的區(qū)別:
EXPIRE_TIME
檢查的是客戶端由于各種原因已經(jīng)異常中斷的會(huì)話,雖然v$session視圖看到處于inactive狀態(tài),但其實(shí)該連接已經(jīng)僵死,不會(huì)再有數(shù)據(jù)請(qǐng)求。IDLE_TIMEOUT
檢查的是處于inactive狀態(tài)超過(guò)指定時(shí)間的會(huì)話,即使客戶端正常連接,到達(dá)超時(shí)時(shí)間后也會(huì)將其中斷。
三、 SESSION_TIMEOUT
指定用戶會(huì)話允許的最長(zhǎng)時(shí)間(以秒為單位)。很明顯這個(gè)參數(shù)要更進(jìn)一步,無(wú)論用戶會(huì)話是不是空閑,到了SESSION_TIMEOUT指定就會(huì)被中斷。
默認(rèn)值為0,表示禁用該功能。
四、 INBOUND_CONNECT_TIMEOUT
表示等待用戶認(rèn)證超時(shí)的時(shí)間。單位是秒,默認(rèn)60秒,如果客戶端在指定的時(shí)間內(nèi)沒(méi)有連接上數(shù)據(jù)庫(kù)(例如用戶認(rèn)證超時(shí)),會(huì)在listener.log中會(huì)出現(xiàn) TNS-12535: TNS:operation timed out,在alert日志中記錄 WARNING: inbound connection timed out (ORA-3136) 和 TNS-12535。
另外在listener.ora中也有一個(gè)INBOUND_CONNECT_TIMEOUT參數(shù),名為:inbound_connect_timeout_監(jiān)聽(tīng)器名。
如果建立監(jiān)聽(tīng)后在設(shè)置的時(shí)間內(nèi)沒(méi)有反應(yīng)將會(huì)斷開(kāi)連接,單位是秒,默認(rèn)60秒。
如果連接請(qǐng)求超時(shí),listener.log中會(huì)出現(xiàn) TNS-12525: TNS:listener has not received client's request in time allowed。
關(guān)于兩者之間的關(guān)系,官方文檔建議INBOUND_CONNECT_TIMEOUT_listener_name的值低于SQLNET.INBOUND_CONNECT_TIMEOUT。
Set both parameters to an initial low value.
Set the value of the INBOUND_CONNECT_TIMEOUT_listener_name parameter to a lower value than the SQLNET.INBOUND_CONNECT_TIMEOUT parameter.
For example, you can set INBOUND_CONNECT_TIMEOUT_listener_name to 2 seconds and INBOUND_CONNECT_TIMEOUT parameter to 3 seconds. If clients are unable to complete connections within the specified time due to system or network delays that are normal for the particular environment, then increment the time as needed.
前面幾個(gè)參數(shù)都是系統(tǒng)級(jí)的,下面來(lái)看可以在用戶級(jí)指定的超時(shí)參數(shù)。
五、 profile中的idle_time
用戶級(jí)的空閑超時(shí)時(shí)間。單位是分鐘,默認(rèn)是UNLIMITED,連接始終不會(huì)被斷開(kāi),這就占用了連接數(shù)資源。
配置步驟如下,注意設(shè)置后對(duì)已經(jīng)連上的會(huì)話不生效,對(duì)新連上的會(huì)話才生效。
-- 查找用戶所屬的profile,例如叫APP_USER select username, b.* from dba_users a, dba_profiles b where a.profile = b.profile and username='USERNAME'; ? -- 更改該profile的idle_time alter profile app_user limit idle_time 30; ? -- 使修改的資源生效,需要設(shè)置resource_limit設(shè)置為true alter system set resource_limit=true;
如果用戶空閑超過(guò)指定時(shí)間,會(huì)報(bào)錯(cuò)ORA-02396:exceeded maximum idle time, please connect again
六、 profile中的connect_time
用戶級(jí)的會(huì)話超時(shí)時(shí)間(類似前面SESSION_TIMEOUT),單位是分鐘,默認(rèn)是UNLIMITED。
用戶會(huì)話在到達(dá)設(shè)置的時(shí)候后不能再繼續(xù)操作(無(wú)論期間是不是空閑)。
設(shè)置方法跟前面類似
-- 查找用戶所屬的profile,例如叫APP_USER select username, b.* from dba_users a, dba_profiles b where a.profile = b.profile and username='USERNAME'; ? -- 更改該profile的connect_time alter profile app_user limit connect_time 30; ? -- 使修改的資源生效,需要設(shè)置resource_limit設(shè)置為true alter system set resource_limit=true;
如果是設(shè)置1分鐘,會(huì)在將近2分鐘的時(shí)候提醒你重新登錄,ORA-02399: exceeded maximum connect time, you are being logged off。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle 12c新特性之如何檢測(cè)有用的多列統(tǒng)計(jì)信息詳解
這篇文章主要給大家介紹了Oracle 12c新特性之如何檢測(cè)有用的多列統(tǒng)計(jì)信息的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03oracle導(dǎo)出數(shù)據(jù)到文本、從文本導(dǎo)入數(shù)據(jù)的詳細(xì)步驟
經(jīng)常有需求向表中導(dǎo)入大量的數(shù)據(jù),使用insert不靠譜,太慢了,oracle提供了sqlldr的工具,這里就為大家簡(jiǎn)單介紹一下2023-05-05直接拷貝數(shù)據(jù)文件實(shí)現(xiàn)Oracle數(shù)據(jù)遷移
Oracle 數(shù)據(jù)遷移是比較麻煩的,對(duì)菜鳥(niǎo)來(lái)說(shuō)更是如此。最近由于更換服務(wù)器,需要將Oracle遷移到另外一臺(tái)機(jī)器,在兩個(gè)服務(wù)器環(huán)境相同,以及 Oracle版本相同的前提下,通過(guò)直接拷貝數(shù)據(jù)文件到新服務(wù)器,就可以直接遷移成功。這里記錄一下遷移步驟。需要的朋友可以參考。2017-01-01深入探討:oracle中方案的概念以及方案與數(shù)據(jù)庫(kù)的關(guān)系
本篇文章是對(duì)oracle中方案的概念以及方案與數(shù)據(jù)庫(kù)的關(guān)系進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Oracle監(jiān)聽(tīng)器服務(wù)不能啟動(dòng)的解決方法
這篇文章主要介紹了Oracle監(jiān)聽(tīng)器服務(wù)不能啟動(dòng)的解決方法,需要的朋友可以參考下2014-07-07Oracle Database 10g數(shù)據(jù)庫(kù)安裝及配置教程
這篇文章主要介紹了Oracle Database 10g Release 2數(shù)據(jù)庫(kù)安裝及配置教程,感興趣的小伙伴們可以參考一下2016-08-08Oracle中分組查詢group by用法規(guī)則詳解
這篇文章主要介紹了Oracle中分組查詢group by用法規(guī)則詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07C#利用ODP.net連接Oracle數(shù)據(jù)庫(kù)的操作方法
本文將介紹C#利用ODP.net連接Oracle數(shù)據(jù)庫(kù)的操作方法,需要的朋友可以參考下2012-11-11