[20200220]關於SQLNET.EXPIRE_TIME and ENABLE=BROKEN的總結.txt
[20200220]關於SQLNET.EXPIRE_TIME and ENABLE=BROKEN的總結.txt
--//昨天做了大量關於SQLNET.EXPIRE_TIME and ENABLE=BROKEN的測試,晚上再仔細看,測試做的有點亂。
--//做一些總結:
1. 12c之前設定SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,DCD判斷連結並不使用TCP keep-alive feature特性。它會定期傳送探測包給客
戶端檢測連結是否正常,如果在1個SQLNET.EXPIRE_TIME之內客戶端有資料包傳送,這個探測包在SQLNET.EXPIRE_TIME(單位:分鐘)時
間到來時,不會傳送探測資料包給客戶端,這樣有可能出現最大2*SQLNET.EXPIRE_TIME時間端內,沒有傳送探測資料包給客戶端的情
況。
這樣會導致一種情況,假設路由器等網路相關設定在10分鐘傳送接受資料包網路就會斷開,設定SQLNET.EXPIRE_TIME最安全的方式是
設定SQLNET.EXPIRE_TIME=5,這樣才能保持連線在空閒時連結不會斷開。
--//注:關於這個10分鐘來歷,可以參考連結:http://blog.itpub.net/267265/viewspace-2150614/=>[20180129]測量網路斷開時間.txt
2. 12之前如果不設定SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,網路連結使用TCP keep-alive feature特性。這點你可以執行
netsta -npo | grep <spid> 看看最後一個欄位是否是keepalive確定。
而linux下實際上使用如下引數:
# echo /proc/sys/net/ipv4/tcp_keepalive* | xargs -n 1 strings -1 -f
/proc/sys/net/ipv4/tcp_keepalive_intvl: 75
/proc/sys/net/ipv4/tcp_keepalive_probes: 9
/proc/sys/net/ipv4/tcp_keepalive_time: 7200
--//引數解析:
/proc/sys/net/ipv4/tcp_keepalive_time 當keepalive起用的時候,TCP傳送keepalive訊息的頻度。預設是2小時。
/proc/sys/net/ipv4/tcp_keepalive_intvl 當探測沒有確認時,keepalive探測包的傳送間隔。預設是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes 如果對方不予應答,keepalive探測包的傳送次數。預設值是9。
預設的引數tcp_keepalive_time設定太長,不使用SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,必須修改核心對應引數符合實際需求。
假設路由器等網路相關設定在10分鐘傳送接受資料包網路就會斷開,這樣必須修改/etc/sysctl.conf檔案:
net.ipv4.tcp_keepalive_time = 590
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes=4
這也是我個人推薦的模式,我個人感覺這樣不會出現上面設定SQLNET.EXPIRE_TIME=5的情況。而且採用TCP keep-alive feature特性
更加科學,因為如果連結有資料包傳送接收,計時重新開始(注:你可以執行sql語句後,使用netsta -npo | grep <spid> 看看最後一個字
段是否是keepalive確定),不會像設定SQLNET.EXPIRE_TIME時,定期傳送探測包給客戶端檢測連結是否正常。
缺點就是必須手工設定核心引數/proc/sys/net/ipv4/tcp_keepalive*引數,符合網路需求。
3.12c之後(包括12c)設定SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,DCD判斷連結使用TCP keep-alive feature特性。實際上就是將
SQLNET.EXPIRE_TIME的數值換成秒,透過呼叫setsockopt(N, SOL_SOCKET, SO_KEEPALIVE, [1], 4) [注:這裡N對應socket的控制程式碼]。
可以透過netsta -npo | grep <spid> 觀察 最後一列是否是keepalive確定。
從這裡也可以看出使用TCP keep-alive feature特性更加合理科學,不然oracle不會採用這種方式。
4.ENABLE=BROKEN 設定在tns連線串中,設定它相當於客戶端使用TCP keep-alive feature特性。
如果不設定ENABLE=BROKEN,就是出現連結http://blog.itpub.net/267265/viewspace-2150555/=>奇怪的SQLNet message from dblink模擬
的情況,大約等927秒(15分鐘)才會報錯。
"缺點"就是必須手工設定核心引數/proc/sys/net/ipv4/tcp_keepalive*引數,符合網路需求,[注:是指客戶端的核心引數。]
而且許多客戶端或者中間伺服器使用的是windows系統,如何修改登錄檔,我還給上網查詢測試看看,明天繼續在查一些資料看看。
5.連結是否可以使用TCP keep-alive feature特性,linux下可以透過執行netsta -npo | grep <程式號> 觀察 最後一列是否是keepalive確定。
這是一種簡單快捷的方式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2676351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle ENABLE=BROKENOracle
- [20200218]ENABLE=BROKEN在連線串中.txt
- Oracle ENABLE=broken引數與TCP KeepAliveOracleTCP
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況.txt
- [20200218]ENABLE=BROKEN在連線串中4.txt
- [20210201]dblink建立連線串使用ENABLE=BROKEN.txt
- [20200218]無ENABLE=BROKEN在連線串中3.txt
- 關於近期的總結
- 關於UIWebView的總結UIWebView
- 關於BeautifulSoup的總結
- 關於HTML的總結HTML
- [20171130]關於rman的一些總結.txt
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況(網路的情況).txt
- sqlserver關於always on的總結SQLServer
- mysql關於variable的總結MySql
- ORACLE關於NULL的總結OracleNull
- 關於ORACLE鎖的總結Oracle
- 關於jboss配置的總結
- sqlserver關於mirror映象的總結SQLServer
- sqlserver 關於DBCC CHECKDB的總結SQLServer
- 關於golang的time包總結Golang
- 關於 iOS 批量打包的總結iOS
- 關於Teradata PI的總結
- 關於控制檔案的總結
- 關於SCN的總結測試
- 關於oracle裡的process總結Oracle
- 關於ORACLE的一點總結Oracle
- 關於QT的系統總結QT
- 關於oracle synonym 的總結整理Oracle
- 關於Servlet小總結Servlet
- 關於Hint再總結
- sqlserver always on關於備份的總結SQLServer
- 關於Map集合的遍歷總結
- postgresql關於許可權的總結SQL
- C中關於堆疊的總結
- SqlServer關於分割槽表的總結SQLServer
- mysql關於臨時表的總結MySql
- mysql關於mysqld_safe的總結MySql