我有一个带有过程的sql脚本。我用它来运行它
sqlplus -s @script.sql logfile.log myparam1 myparam2
但是在大约2小时10分钟之后,我的脚本以
ERROR:
ORA-03114: not connected to ORACLE
DECLARE
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 12345
Session ID: 33 Serial number: 54321
我有以下tcp设置
-bash-4.1$ cat /proc/sys/net/ipv4/tcp_keepalive_time (which is two hours)
7200
-bash-4.1$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
-bash-4.1$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
当脚本运行时,我检查了TCP连接是否已经建立,但是在数据库端(数据库服务器机器)上没有这样的连接。
我的理论是,数据库服务器正在以某种方式丢弃连接。当我的系统在2小时(7200秒)后发送第一个keepalive探测器时,它发现连接不再处于活动状态并关闭连接并返回脚本。
我无法理解为什么数据库系统会丢弃连接? 数据库端是否有任何设置可以增加冗长度?或者这可能与某些防火墙设置有关?此外,在2小时10分钟内,我们可以猜测2小时部分来自tcp_keepalive_time,这将是10分钟的部分。任何数据库端重试?
编辑:DBA和我看了一下这个问题,我看到我的TCP连接已经建立,并且他没有看到任何来自我身边的连接。
答案 0 :(得分:1)
如果我们的防火墙在大约两个小时之后放弃我们的Pro * C连接,如果我们在那个时期没有任何活动,那么我们就有了类似的东西。我们的解决方案是:
select 1 from dual;
每个数据库连接每15分钟一次,以保持活动状态。
如果我没记错的话,只有当连接有一个带SO_KEEPALIVE的setsockopt调用时,才会使用上面提到的tcp保持活动时间。由于与Oracle的实际连接由Oracle管理,我们无法知道它是否已设置。
在查看此内容时,我在网上看到了sqlnet.expire_time=minutes_to_check
文件中$ORACLE_HOME/network/admin/sqlnet.ora
对<style name="CustomSelectHandle">
<item name="android:textSelectHandle">@drawable/small_rect</item>
<item name="android:textSelectHandleLeft">@drawable/small_rect</item>
<item name="android:textSelectHandleRight">@drawable/small_rect</item>
</style>
的一些引用(this和this)。他们说:
使用此参数,在10分钟不活动后, 服务器向客户端发送一个小的10字节探测包。如果这 数据包未确认,连接将被关闭......
下次我得到DBA的注意时,我将不得不让他们改变这个值,看看它是如何影响事情的。在第二个链接的后面,他们说:
如果SQLNET.EXPIRE_TIME小于FW连接空闲 超时,然后防火墙会将此数据包视为活动,并且 空闲超时(防火墙停电)永远不会发生,直到两者都有 客户端和服务器进程都还活着。
我希望这正是我们所需要的。
答案 1 :(得分:1)
答案 2 :(得分:0)
通信信道上的文件结尾很少是数据库端问题。 如果您怀疑数据库端有问题,请通过gv $ session监控会话活动。如果会话是&#34;挂&#34;你将能够马上找到。或者在特定声明中长期运行。松散与DB的连接并不罕见,尤其是在网络不稳定的情况下。
答案 3 :(得分:0)
我们尝试将SQLNET.EXPIRE_TIME设置为10分钟。但它没有用。我们退回了数据库服务器机器,但它仍然没有工作。也许一些最新的防火墙可能看不到DCD数据包作为有效流量,如文章 mentioned in the article中所述(上文也由@ user1683793给出)。 最后,我们将保持活动时间更改为25分钟(在客户端计算机上),以便在tcp连接上有一些流量。幸运的是,防火墙似乎将保持活动数据包视为流量。
-bash-4.1$ cat /proc/sys/net/ipv4/tcp_keepalive_time
1500