问题:
当我尝试在我的 Oracle 19c 数据库上通过 OpenVPN 运行收集统计信息时,如果运行超过一定时间,SQL Developer 不会返回典型的“PL/SQL 过程已成功完成”消息。
显然,连接会在一段时间后挂起,我要么需要断开与 OpenVPN 的连接,要么需要在 Windows 任务管理器中杀死 SQL Developer 以关闭它。
我的 Oracle 19c 数据库和 OpenVPN 服务器位于不同的云提供商上。
在此数据库上运行收集统计信息通常需要大约半小时。
我检查了什么:
OpenVPN 服务器上的 Iptables 和 OpenVPN 日志或 Oracle 19c 服务器上的侦听器和警报日志上没有任何异常。
net.ipv4.tcp_keepalive_time 和 net.netfilter.nf_conntrack_tcp_timeout_established 在两台机器上都设置为它们的默认值 7200(2 小时)和 432000(5 天)。
如果我以系统身份连接到数据库并运行:
选择 x.sid, x.serial#, x.username, x.status, x.osuser, x.machine, x.program, x.event, x.state, sql.sql_text from v$sqlarea sql, v$session x 其中 x.sql_hash_value = sql.hash_value 和 x.sql_address = sql.address 和 x.username = 'myuser';
大约半小时后,我注意到收集统计信息的会话处于非活动状态。所以我假设收集统计信息确实运行并成功完成,但只是不返回上述输出消息。
我尝试了什么:
在同一实例中的较小数据库上,通过 OpenVPN 运行收集统计信息会返回上述成功消息。这个大约需要 10 分钟。
通过将我的 IP 地址添加到云提供商的防火墙并运行收集统计信息来直接(不使用 OpenVPN)连接到数据库也会返回上述成功消息。
在 Oracle 19c 服务器上生成 SSH 公钥/私钥对并在 SQL Developer 上使用 SSH 主机,但连接非常不稳定/总是在重置。
设置 Dante 代理服务器。显然,SQL Developer 只能使用某种特殊的代理服务器。
使用 StrongSwan 设置 IPSEC VPN。由于某种原因,我的 Windows 10 无法与其建立连接。
首先,我能够通过运行确认收集统计信息确实成功完成:
之后,我在两台服务器上运行了以下 tcpdump 命令:
并发现 Oracle 19c 服务器确实发送了成功消息,但 OpenVPN 服务器从未收到它。
在各个站点上进行了一些挖掘之后,我发现我误解了 net.ipv4.tcp_keepalive_time 的实际作用。
之后,我发现了托管 OpenVPN 服务器的云提供商的网络配置。
有了这些新信息,我通过在 Oracle 19c 服务器上运行以下命令将 keepalive 时间设置为小于 10 分钟的值,从而绕过了这个限制:
并通过将它们保存到 /etc/sysctl.conf 使这些更改永久化。
最后,SQL Developer 收到成功消息并关闭连接。