[20141219]關於sqlnet.expire_time.txt

lfree發表於2014-12-19

[20141219]關於sqlnet.expire_time.txt

***********************************************************************

Fatal NI connect error 12537, connecting to:
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.xxx.xxx)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=xxxx.com)(CID=(PROGRAM=oracle)(HOST=xxx)(USER=oracle11g))))

  VERSION INFORMATION:
    TNS for Linux: Version 11.2.0.4.0 - Production
    TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production
  Time: 18-APR-2014 11:05:46
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12537

TNS-12537: TNS:connection closed
    ns secondary err code: 12560
    nt main err code: 507

TNS-00507: Connection closed
    nt secondary err code: 0
    nt OS err code: 0

--如果應該經常出現這樣的錯誤,主要問題可能出現在內網的防火牆設定,如果應用保持連線而長時間沒有操作,一些網路裝置就會斷開連線,
--解決方法就是透過設定服務端的sqlnet.ora檔案的sqlnet.expire_time引數,來主動向客戶端傳送檢測請求,如果客戶端還活著,則不做操
--作,如果檢測發現客戶端的連線已經不存在或沒有反映,則回收這個session的資源。這樣,如果DCD的檢測時間小於防火牆設定的空閒連線
--最大存活時間,那麼由於DCD檢測客戶端存活性需要從服務端傳送一個空包到客戶端,防火牆就會重新計算這個連線的空閒時間,就不
--會中斷這個會話了。設定DCD需要在服務端的sqlnet.ora檔案中新增以下資訊:

sqlnet.expire_time = 5

這個值的單位是分鐘,這裡設定的是每五分鐘服務端會向已連線資料庫的session所在的客戶端傳送一個空包,來檢測客戶端的存活性,
如果防火牆限制的空閒連線時間大於5分鐘,那麼連線到資料庫的會話就不會因為大於5分鐘的空閒時間而被中斷。這種方案完全可以解決
這個問題,但這種方法需要重新註冊監聽。

--簡單做一個測試:

1.修改 sqlnet.ora檔案,加入:
SQLNET.EXPIRE_TIME=1

重啟監聽。

2.遠端開啟連線資料庫,不做任何操作。

3.在服務端執行如下命令:
# tcpdump -i eth0 -nnn host 192.168.xxx.xxx and port 1521
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:13:11.436128 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 2119621137:2119621147(10) ack 2682317414 win 16060
11:13:11.636552 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 10 win 63492
11:14:11.437488 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 10:20(10) ack 1 win 16060
11:14:11.637790 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 20 win 63482
11:15:11.437914 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 20:30(10) ack 1 win 16060
11:15:11.637900 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 30 win 63472
11:16:11.438691 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 30:40(10) ack 1 win 16060
11:16:11.637143 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 40 win 63462
11:17:11.439824 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 40:50(10) ack 1 win 16060
11:17:11.639376 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 50 win 63452
11:18:11.441028 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 50:60(10) ack 1 win 16060
11:18:11.640484 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 60 win 63442
11:19:11.441949 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 60:70(10) ack 1 win 16060
11:19:11.641719 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 70 win 63432

--可以看到每隔1分鐘,服務端向客戶端發起連線,檢測客戶端是否存在。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-1373080/,如需轉載,請註明出處,否則將追究法律責任。