[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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20200218]ENABLE=BROKEN在連線串中.txt
- oracle ENABLE=BROKENOracle
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況.txt
- [20200218]ENABLE=BROKEN在連線串中4.txt
- [20210201]dblink建立連線串使用ENABLE=BROKEN.txt
- [20200218]無ENABLE=BROKEN在連線串中3.txt
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況(網路的情況).txt
- Oracle ENABLE=broken引數與TCP KeepAliveOracleTCP
- [20200220]windows設定keepalive引數.txtWindows
- 關於近期的總結
- mysql關於variable的總結MySql
- sqlserver關於always on的總結SQLServer
- sqlserver 關於DBCC CHECKDB的總結SQLServer
- sqlserver關於mirror映象的總結SQLServer
- 關於golang的time包總結Golang
- 關於Servlet小總結Servlet
- mysql關於mysqld_safe的總結MySql
- mysql關於mysql.server的總結MySqlServer
- 關於PaaS的純乾貨總結
- mysql關於表空間的總結MySql
- 關於Android Studio使用Git的總結AndroidGit
- 關於STL容器的簡單總結
- SqlServer關於分割槽表的總結SQLServer
- postgresql關於許可權的總結SQL
- sqlserver always on關於備份的總結SQLServer
- 關於Map集合的遍歷總結
- C中關於堆疊的總結
- mysql關於臨時表的總結MySql
- Android 關於 so 檔案的總結Android
- 關於git的基本核心操作總結Git
- 關於資料庫鎖的總結資料庫
- mysql關於memory引擎的表的總結MySql
- 關於vue基礎總結Vue
- 關於題目集1~3的總結
- 關於Vue中插槽的理解和總結Vue
- 關於Mysql使用的一些總結MySql
- 關於v-for的一點小總結
- 關於題目集7~8的總結