目的:
环境:
数据库服务器端:
操作系统: Oracle linux6.5
数据库: Oracle database 11.2.0.4
ip: 192.192.192.3
service_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_keepalive_time),则数据库服务器端会发送一个tcp侦测包,如果此侦测包得到了响应,那么数据库服务器端会再等待10秒,如果在等待的10秒内tcp连接仍旧一直处于空闲状态,那么库服务器端会再发送一个tcp侦测包,如此往复。但是,如果数据库服务器端发送的tcp侦测包没有得到响应,那么数据库服务器端会每隔2秒(tcp_keepalive_intvl)发送一个tcp侦测包,直至得到响应后继续按10秒的间隔发tcp侦测包,或者,发送的tcp侦测包达到了20个(tcp_keepalive_probes)仍旧没有得到响应,那么数据库服务器端会认为这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抓包结果
[oracle@oel6-11204-norac ~]$ tcpdump -nn port 1521
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抓包结果
[oracle@oel6-11204-norac ~]$ tcpdump -nn port 1521
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功能,能够让没有在应用层实现会话存活检测功能的客户端程序也能感知到数据库连接的中断。
应用场景:
ENABLE=broken参数在复杂网络环境中,使用db link进行耗时的跨库分布式事务操作中,比较有用。
因为在db link中默认情况下,客户端调用服务端耗时的存储过程或执行耗时的查询,db link连接可能会被防火墙中断,而此时客户端却无法感知到中断,认为服务端还没有返回结果,会一直持有资源,导致阻塞的发生。而如果db link客户端上使用 ENABLE=broken参数, 客户端便可以不修改程序的情况下感知到中断,从而释放其持有的资源。