首页 > 数据库 >Oracle DCD和Linux TCP KeepAlive和网络硬件防火墙探讨

Oracle DCD和Linux TCP KeepAlive和网络硬件防火墙探讨

时间:2024-01-31 11:38:58浏览次数:39  
标签:grep 2.189 DCD oracle1 tcp TCP 192.168 Linux keepalive

 

Oracle DCD和Linux TCP KeepAlive和网络硬件防火墙探讨

 

Oracle的某些会话在超时断开后在警告日志抛出一定量类似如下日志:

Fri Aug 19 17:51:32 2022


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

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: 19-AUG-2022 17:51:32
  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.1.14)(PORT=57791))

 

咨询网络管理员,得到如下回复:

1.同个机房之间不经过防火墙;

2.区域A和区域B(跨机房)之间经过硬件防火墙,长连接超时设置如下: 从A->B,1天;从B->A,15天;

3.区域A,B之间细粒度是机房的,任何数据库,应用等产生网络数据均会刷新长连接计时,,,,,,实际上每时每刻均会有数据交互。

 

上诉提到的会话S1报错是跨机房的,报错时间是2022-08-19 17:51:32,查看S1会话的监听日志发现该会话是2022-05-23 17:25:46建立连接的。

相差了3个月左右。

<msg time='2022-05-23T17:25:46.561+08:00' org_id='oracle' comp_id='tnslsnr'
 type='UNKNOWN' level='16' host_id='xxxxdb1'
 host_addr='192.168.1.51'>
 <txt>23-MAY-2022 17:25:46 * (CONNECT_DATA=(SERVICE_NAME=xxxxdb)(CID=(PROGRAM=C:\Program?Files\PLSQL?Developer?14\plsqldev.exe)(HOST=MACHINE02)(USER=zhaokm))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.14)(PORT=57791)) * establish * xxxxdb * 0
 </txt>
</msg>

目前可以排除网络硬件防火墙设置导致会话断开。

查看其他数据库2022-08-19 17点左右的日志,核心库也存在大量的日志报错。

且OEM有大量提示无法检测到数据库的报警,判断是网络引起的问题。

 

 

实际除了防火墙,Linux OS本身也存在TCP的保活机制。

摘自:https://blog.csdn.net/qq_27706119/article/details/128734024

Linux内核自带的保活机制keep-alive。使用的时候只需要打开keep-alive功能即可。

TCP的Keepalive机制的作用是在于探测连接的对端是否存活。

工作原理:TCP keep-alive是通过在空闲时发送TCP Keep-Alive数据包,然后对方回应TCP Keep-Alive ACK来实现的。

在socket网络编程中,需要设置一个socket选项 SO_KEEPALIVE,才能开启keepalive机制。

在Linux的keepalive机制中,有3个重要的内核参数:tcp_keepalive_time、tcp_keepalive_probes 和 tcp_keepalive_intvl。

tcp_keepalive_time:表示TCP连接闲置多长时间后开始发送探测报文。(单位:秒)

tcp_keepalive_probes:表示一次探测过程中最多可以重发探测报文的次数。(没有收到确认时重发次数)

tcp_keepalive_intvl:表示前一个探测报文和后一个探测报文之间的时间间隔。(即超时重传的时间间隔)(单位:秒)

测试的时候调整为比较小的时间进行观察:

sysctl -w net.ipv4.tcp_keepalive_time=60

sysctl -w net.ipv4.tcp_keepalive_probes=2

sysctl -w net.ipv4.tcp_keepalive_intvl=10

使用PLSQL Developer远程发起一个连接到数据库,使用ss或者netstat命令查看客户端会话信息,可以明显看到keppalive的计时,如下:

[root@oracle1 ~]# ss -o state established ' dst 192.168.2.189 ' | grep -v ssh
Recv-Q Send-Q           Local Address:Port               Peer Address:Port   
0      0                 192.168.1.47:ncube-lm           192.168.2.189:52193    timer:(keepalive,47sec,0)
[root@oracle1 ~]# netstat -anptwo | grep 192.168.2.189 | grep  -v ssh
tcp        0      0 192.168.1.47:1521           192.168.2.189:52193         ESTABLISHED 11299/oracleqadb1   keepalive (44.91/0/0)

 

因此,实际在OS层面已经确保会话默认2h内不会断开。

 

再说说Oracle DCD(死连接检测,即Dead Connection Detection),用于检查那些死掉但没有断开的session。

当设置了SQLNET.EXPIRE_TIME,定时器会根据设置的值定期向会话发送侦测包来确定会话是否已经异常断开。

详情可见:Archived: Dead Connection Detection (DCD) Explained (Doc ID 151972.1)

根据我查看的一些资料,比如老熊的两篇文章:Oracle与防火墙防火墙、DCD与TCP Keep alive

里边有提到,设置DCD会导致关闭了TCP本身的keep-alive功能,且本身DCD也无法生效。

比如设置DCD为1分钟,

[oracle@oracle1 admin]$ cat sqlnet.ora 
SQLNET.EXPIRE_TIME= 1

 

使用PLSQL Developer重新发起一个连接到数据库,使用ss或者netstat命令查看客户端会话信息,会发现无法获取到keppalive的信息了。

[root@oracle1 ~]# ss -o state established ' dst 192.168.2.189 ' | grep -v ssh
Recv-Q Send-Q           Local Address:Port               Peer Address:Port   
0      0                 192.168.1.47:ncube-lm           192.168.2.189:58126   
[root@oracle1 ~]# netstat -anptwo | grep 192.168.2.189 | grep  -v ssh
tcp        0      0 192.168.1.47:1521           192.168.2.189:58126         ESTABLISHED 8518/oracleqadb1    off (0.00/0/0)
[root@oracle1 ~]# 

 

同时,使用service network stop断开网络连接,发现几分钟内也没有回收PLSQL Developer的会话。

ss和netstat查看信息,会发现存在计时,且为0后重新从2分钟倒计时..循环这个过程。

[root@oracle1 Desktop]# ss -o state established ' dst 192.168.2.189 ' | grep -v ssh
Recv-Q Send-Q           Local Address:Port               Peer Address:Port   
0      80                192.168.1.47:ncube-lm           192.168.2.189:58126    timer:(persist,25sec,11)
[root@oracle1 Desktop]# ss -o state established ' dst 192.168.2.189 ' | grep -v ssh
Recv-Q Send-Q           Local Address:Port               Peer Address:Port   
0      80                192.168.1.47:ncube-lm           192.168.2.189:58126    timer:(persist,22sec,11)
[root@oracle1 Desktop]# netstat -anptwo | grep 192.168.2.189 | grep -v ssh
tcp        0     80 192.168.1.47:1521           192.168.2.189:58126         ESTABLISHED 8518/oracleqadb1    probe (19.25/0/11)
[root@oracle1 Desktop]# netstat -anptwo | grep 192.168.2.189 | grep -v ssh
tcp        0     80 192.168.1.47:1521           192.168.2.189:58126         ESTABLISHED 8518/oracleqadb1    probe (7.98/0/11)
[root@oracle1 Desktop]# netstat -anptwo | grep 192.168.2.189 | grep -v ssh
tcp        0     80 192.168.1.47:1521           192.168.2.189:58126         ESTABLISHED 8518/oracleqadb1    probe (119.96/0/12)
[root@oracle1 Desktop]# ss -o state established ' dst 192.168.2.189 ' | grep -v ssh
Recv-Q Send-Q           Local Address:Port               Peer Address:Port   
0      80                192.168.1.47:ncube-lm           192.168.2.189:58126    timer:(persist,1min58sec,12)

 

BUG还是很多的,DCD。

 

参考:

ORACLE的Dead Connection Detection浅析

https://www.cnblogs.com/chhyan-dream/p/16226134.html

How to Check if Dead Connection Detection (DCD) is Enabled in 9i ,10g and 11g (Doc ID 395505.1)

Versions 11, 12 and Newer Databases: Fatal NI Connect Error 12170, 'TNS-12535: TNS:operation timed out' Reported in Alert Log (Doc ID 1286376.1)

 

标签:grep,2.189,DCD,oracle1,tcp,TCP,192.168,Linux,keepalive
From: https://www.cnblogs.com/PiscesCanon/p/17998838

相关文章

  • Linux下的查看已安装软件、卸载
    因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了,总结起来有这样几类:1、使用rpm包方式安装的,可以用rpm-qa命令查看到,如果要查找某软件包是否安装,用rpm-qa|grep“软件或者包的名字”。例如,查看有没有ruby:[root@hexuweb102~]rpm-qa|gre......
  • Linux脚本之文件内容去重脚本
    前言脚本为自用脚本,用于在Linux上完成文件内容的去重工作,但是此文件对二进制文件无效,只针对文本文件进行去重脚本内容#!/bin/bash#检查参数是否正确if[$#-ne1];thenecho"用法:$0<文件名>"exit1fi#获取指定文件的文件名filename=$1#使用sort和uniq......
  • linux系统根目录扩容
    linux系统根目录扩容系统版本:CentOSLinuxrelease7.5.1804(Core)文件系统类型:xfs基本概念:PV(PhysicalVolume)-物理卷物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。VG(VolumneGroup)-卷组卷组建立在物理卷之上,一个卷......
  • Linux端口被占用
    以下是一些解决Linux端口被占用的方法:step1.使用lsof命令查找占用端口的进程在终端中使用以下命令可以查找指定端口被哪个进程占用:sudolsof-i:端口号例如,要查找端口号为8080的进程,可以使用以下命令:sudolsof-i:8080该命令将返回占用该端口的进程的详细信息,包......
  • AP8851L DCDC降压恒压输出12V 5V2.5A应用资料及BOM清单
    1.方案特性双层PCB板(L42mm×W25mm×H15mm) 输入电压范围:11V~85V(输出5V)18V~85V(输出12V) 输出电流:2.5A 效率:93.8%(输出12V)2.应用领域 扭扭车控制器 平衡车控制器电动车控制器 快充电源 逆变器系统工业控制系统3方案原理图及工作原理描述 4,AP8851-5......
  • 如何在Windows上和Linux上配置自启动服务?
    我们以FastTunnel这个内网穿透工具为例,其中Server端的程序运行在Linux上,Client端的程序运行在Windows上。关于这个程序的配置请参考官方文档:快速上手:快速搭建服务。为了避免每次手动启动程序,我们把它们做成开启自启动的服务,这样你就可以无缝使用远程桌面了。Windows下载n......
  • Kali学习笔记-01-安装Kali Linux2
    Kali学习笔记-01-安装KaliLinux2KaliLinux网络安防使用的VMWare版本信息如下:kaliLinux下载网页是https://www.kali.org/get-kali/#kali-virtual-machines。在页面上选择VMware64位版本下载。下载之后得到一个.7z的压缩文件,名字为kali-linux-2023.4-vmware-amd64.7z,解压缩......
  • 在RunnerGo测试平台中做WebSocket、Dubbo、TCP/IP接口测试
    大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。WebSocket协议WebSocket是一种在单个TCP连接上进行全双工通信的API技术。相比于传统的HTTP请求,We......
  • 在RunnerGo测试平台中做WebSocket、Dubbo、TCP/IP接口测试
    大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。WebSocket协议WebSocket是一种在单个TCP连接上进行全双工通信的API技术。相比于传统的HTTP请......
  • Ali Cloud Linux3 : Installing ImageMagick for PHP 7.4
    Step1:Ifnotalreadyinstalled,installthephp-develandgccpackages.$sudoyuminstallphp-develgccTocheckifthepackagesareinstalled,usethefollowingcommands.Ifeithercommandreturnsanemptyresult(orbothdo),you’llneedtoinstallth......