Oracle ENABLE=broken参数与TCP KeepAlive

来源:这里教程网 时间:2026-03-03 17:41:11 作者:

环境:

    数据库服务器端:操作系统:        Oracle linux6.5数据库:           Oracle database 11.2.0.4ip:                     192.192.192.3service_name:orcl参数相关设置:无sqlnet.ora文件,listener未设置任何参数。net.ipv4.tcp_keepalive_time = 10,net.ipv4.tcp_keepalive_probes = 20,net.ipv4.tcp_keepalive_intvl = 2    客户端: 操作系统:             Oracle linux6.5 数据库客户端工具:sqlplus  11.2.0.4 ip:                          192.192.192.4 参数相关设置: 无sqlnet.ora文件。net.ipv4.tcp_keepalive_time = 6,net.ipv4.tcp_keepalive_probes = 10,net.ipv4.tcp_keepalive_intvl = 1

Linux内核TCP KeepAlive参数介绍:

net.ipv4.tcp_keepalive_time :在TCP连接空闲时间段内,内核会以此参数设定的 时间间隔发送 tcp侦测包。单位秒。net.ipv4.tcp_keepalive_probes :如果连续N个 发出去的tcp 侦测包没有响应,则内核认为此TCP连接已经中断了,并通知应用程序。 N即此参数设定的值。net.ipv4.tcp_keepalive_intvl :如果发出去的tcp 侦测包没有得到响应,那么会以此参数设定的间隔发送tcp 侦测包,直至得到响应,或者超过 net.ipv4.tcp_keepalive_probes设定的次数,被认为连接中断 。单位秒。例如:    按上面环境中数据库服务器的设置来说明,如果tcp连接空闲时间达到10秒,则 数据库服务器端会发送一个tcp侦测包,如果此侦测包得到了响应,那么 数据库服务器端会再等待10秒,如果10秒内tcp连接仍旧一直处于空闲状态,那么 库服务器端 会再发送一个tcp侦测包,如此往复。如果 数据库服务器端 发送的tcp侦测包没有得到响应,那么 数据库服务器端会每隔2秒发送一个 tcp侦测包,直至得到响应后继续按10秒的间隔发 tcp侦测包,或者,发送的 tcp 侦测包达到了20个仍旧没有得到响应,那么 数据库服务器端会认为这tcp连接已经中断了,给应用层程序发通知。

实验1:

    客户端tnsname中不加ENABLE=broken参数。

# 客户端连接数据库
[oracle@oel6-11204-norac ~]$ sqlplus sys@orcl as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Sun Jun 12 22:59:26 2022
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> 
# tcpdump抓包结果
22:59:40.001193 IP 192.192.192.3.1521 > 192.192.192.4.14330: Flags [.], ack 1995, win 162, options [nop,nop,TS val 13687124 ecr 13652371], length 0
22:59:40.001229 IP 192.192.192.4.14330 > 192.192.192.3.1521: Flags [.], ack 2728, win 199, options [nop,nop,TS val 13662372 ecr 13677083], length 0
22:59:50.002356 IP 192.192.192.3.1521 > 192.192.192.4.14330: Flags [.], ack 1995, win 162, options [nop,nop,TS val 13697125 ecr 13662372], length 0
22:59:50.002392 IP 192.192.192.4.14330 > 192.192.192.3.1521: Flags [.], ack 2728, win 199, options [nop,nop,TS val 13672373 ecr 13677083], length 0
23:00:00.004261 IP 192.192.192.3.1521 > 192.192.192.4.14330: Flags [.], ack 1995, win 162, options [nop,nop,TS val 13707127 ecr 13672373], length 0
23:00:00.004296 IP 192.192.192.4.14330 > 192.192.192.3.1521: Flags [.], ack 2728, win 199, options [nop,nop,TS val 13682375 ecr 13677083], length 0
23:00:10.005410 IP 192.192.192.3.1521 > 192.192.192.4.14330: Flags [.], ack 1995, win 162, options [nop,nop,TS val 13717128 ecr 13682375], length 0
23:00:10.005436 IP 192.192.192.4.14330 > 192.192.192.3.1521: Flags [.], ack 2728, win 199, options [nop,nop,TS val 13692376 ecr 13677083], length 0

实验2:

    客户端tnsname中加ENABLE=broken参数。

# 客户端连接数据库
[oracle@oel6-11204-norac ~]$ sqlplus sys@orcl as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Sun Jun 12 22:59:26 2022
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> 
# tcpdump抓包结果
23:04:28.163882 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13975287 ecr 13940532], length 0
23:04:28.163918 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13950534 ecr 13971245], length 0
23:04:30.123721 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13952494 ecr 13971245], length 0
23:04:30.127384 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13977250 ecr 13950534], length 0
23:04:36.127516 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13958498 ecr 13977250], length 0
23:04:36.128661 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13983251 ecr 13950534], length 0
23:04:38.163949 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13985287 ecr 13950534], length 0
23:04:38.163976 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13960534 ecr 13983251], length 0
23:04:42.129380 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13964500 ecr 13983251], length 0
23:04:42.129898 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13989253 ecr 13960534], length 0
23:04:48.129365 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13970500 ecr 13989253], length 0
23:04:48.129919 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13995253 ecr 13960534], length 0
23:04:48.164646 IP 192.192.192.3.1521 > 192.192.192.4.14447: Flags [.], ack 2025, win 162, options [nop,nop,TS val 13995287 ecr 13960534], length 0
23:04:48.164674 IP 192.192.192.4.14447 > 192.192.192.3.1521: Flags [.], ack 2726, win 199, options [nop,nop,TS val 13970535 ecr 13995253], length 0

结论:

    通过上面两个实验的结果,我们可以知道,当客户端没有使用 ENABLE=broken参数时,只有数据库服务端定时主动往客户端发送了tcp keepalive的侦测包,客户端响应侦测包; 当客户端使用了 ENABLE=broken参数后, 数据库 服务端会定时 主动 往客户端发送了tcp keepalive的侦测包,客户端也 会定时 主动数据库服务端发送了tcp keepalive的侦测包。     即 ENABLE=broken启用了客户端的 tcp keepalive功能,能够让没有在应用层实现keepalive功能的客户端也能感知到数据库连接的中断。

应用场景:

     ENABLE=broken参数在复杂网络环境中,使用db link进行复杂的跨库分布式事务操作中,比较有用。     因为在db link中默认情况下,客户端调用服务端耗时的存储过程或执行耗时的查询,db link连接可能会被防火墙中断,而此时客户端却无法感知到中断,会一直持有资源,导致阻塞的发生。而如果db link客户端上使用 ENABLE=broken参数, 客户端便可以感知到中断,并释放其持有的资源。    

相关推荐