Oracle-TNS-12170/TNS-12535/TNS-12560/TNS-00505問題分析


問題背景

客戶在系統切換之后,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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM