問題背景
客戶在系統切換之后,RAC Linux 11.2.0.4環境,系統主連1個節點,但是日志經常出現TNS-12535、TNS-00505報錯,具體報錯信息如下,希望給出合理解釋。
問題分析
- 問題出現原因
根據MOS官方的文檔顯示,TNS-12535、TNS-00505這樣的錯誤為服務器和客戶端建立的鏈接,長時間空閑,期間網絡中斷造成,具體展示流程如下:
1)會話A,在上10:30分連入數據庫操作;
2)10:35分操作完成之后一直保持空閑鏈接狀態,直到12:35分,這期間經過2個小時空閑;
3)在2個小時內,會話連接可能被防火牆或者其他設備中斷,但是數據庫服務端並不知曉;
4)數據庫會通過系統網絡參數,tcp_keepalive_time、tcp_keepalive_probes、tcp_keepalive_intvl進行判斷,如果為異常鏈接,則寫入alert日志中。 - 解決方法
1)檢查防火牆是否有空閑鏈接斷開的設置
2)在服務端sqlnet.ora中設置SQLNET.EXPIRE_TIME=n(單位分鍾)
3)服務器端sqlnet.ora中設置DIAG_ADR_ENABLED = OFF,服務器端 listener.ora中設置DIAG_ADR_ENABLED_= OFF(DIAG_ADR_ENABLED_LISTENER = OFF)屏蔽報錯信息
expire_time參數,來主動向客戶端發送檢測請求,如果客戶端還活着,則不做操 作,如果檢測發現客戶端的連接已經不存在或沒有反映,則回收這個session的資源。這樣,如果DCD(Dead Connection Detection)的檢測時間小於防火牆設置的空閑連接 最大存活時間,那么由於DCD檢測客戶端存活性需要從服務端發送一個空包到客戶端,防火牆就會重新計算這個連接的空閑時間,就不會中斷這個會話了
- 參考文檔
Alert Log Errors: 12170 TNS-12535/TNS-00505: Operation Timed Out (Doc ID 1628949.1)
在 11g 12c已經更高版本的數據庫中 alert 日志中報 Fatal NI Connect Error 12170, 'TNS-12535: TNS:operation timed out' (Doc ID 2226594.1)
A Demonstration of the Alert Log Timeouts Occur: TNS-12170/TNS-12535/TNS-12560/TNS-00505 (Doc ID 2461900.1)
問題復現
1、環境准備
調整系統網絡參數,模擬keepalive判斷空閑時間,此處設置表示
數據庫針對空閑鏈接會在(60+12+12)=84s之后檢測到TCP斷開,如果這個鏈接已經異常的話。
[root@zstest ~]# sysctl -a|grep keep
net.ipv4.tcp_keepalive_intvl = 12
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 60
- net.ipv4.tcp_keepalive_time - 在第一次keep alive請求發送后,不活動連接的時間
- net.ipv4.tcp_keepalive_probes - 在這個連接被認為是斷開之前,keep alive請求被重發的次數
- net.ipv4.tcp_keepalive_intvl - keep alive探測的時間間隔
2、實驗過程
1) 模擬客戶端連接
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4 - 64bit Production
SQL> select s.sid,s.serial#,p.spid,s.port from v$session s, v$process p, (select * from v$mystat where rownum=1) ms where s.paddr=p.addr and s.sid=ms.sid;
SYSDATE SID SERIAL# SPID port
---------- ---------- -------- --------- -------
16:41:45 142 45921 9275 60583
2) listener.log日志發現有心鏈接進來
15-JUL-2020 16:41:45 * (CONNECT_DATA=(SERVICE_NAME=orcl)(CID=(PROGRAM=D:\Program?Files\PLSQL?Developer\plsqldev.exe)(HOST=DESKTOP-0319KP6)(USER=pc_zhangs))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.70.26)(PORT=60583)) * establish * orcl * 0
3) 再次觸發客戶端會話,之后通過iptables模擬鏈接中斷,記錄最后一次會話活躍時間 16:44:17
SQL> select sysdate,s.sid,s.serial#,p.spid,s.port from v$session s, v$process p, (select * from v$mystat where rownum=1) ms where s.paddr=p.addr and s.sid=ms.sid;
SYSDATE SID SERIAL# SPID port
---------- ---------- -------- --------- -------
16:44:17 142 45921 9275 60583
4) 通過iptables,模擬會話被drop,lsof 命令可以看到會話被iptables drop之后,oracle依然處於連接狀態,這也說明Oracle內部記錄此鏈接仍然是建立,只是會話狀態為INACTIVE
[root@zstest ~]# iptables -A INPUT -p tcp -s 192.168.70.26 --sport 60583 -j DROP
[root@zstest ~]# date
Wed Jul 15 16:44:27 CST 2020
[root@zstest ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
DROP tcp -- 192.168.70.26 0.0.0.0/0 tcp spt:60583
[root@zstest ~]# lsof -Pani :60583
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
oracle 9275 oracle 14u IPv6 27811724 0t0 TCP 192.168.20.242:1521->192.168.70.26:60583 (ESTABLISHED)
5) 通過Oracle內部視圖查看鏈接狀態
SQL> select sysdate,s.sid,s.serial#,p.spid,event,status,state from v$session s, v$process p where s.paddr=p.addr and s.sid=49;
SYSDATE SID SERIAL# SPID EVENT STATUS STATE
------------------- ---- --------- ------ ------------------------------ -------- -------
2020-07-15 16:44:50 142 45921 9275 SQL*Net message from client INACTIVE WAITING
6)根據之前系統 (tcp keepalive timeout)設置,在會話最后一次執行16:44:17之后84s,Oracle會判斷此鏈接異常,並寫入alert日志,從日志可以看出,alert日志記錄時間為16:45:42。
最后一次會話執行時間 A:16:44:17
alert日志報錯時間 B:16:45:42
B-A=85s
系統設置如果網絡會話在空閑84s后檢測出鏈接異常(本實驗通過iptables已經中斷會話),則會報TNS-12535\TNS-00505錯誤,與預期結果相符,實驗結束。
Fatal NI connect error 12170.
VERSION INFORMATION:
TNS for Linux: Version 11.2.0.4.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production
Time: 15-JUL-2020 16:45:42
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS:operation timed out
ns secondary err code: 12560
nt main err code: 505
TNS-00505: Operation timed out
nt secondary err code: 110
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.70.26)(PORT=60583))