ORA-03113:约2小时10分钟后

时间:2017-06-05 21:52:32

标签: oracle tcp ora-03114

我有一个带有过程的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连接已经建立,并且他没有看到任何来自我身边的连接。

4 个答案:

答案 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> 的一些引用(thisthis)。他们说:

  

使用此参数,在10分钟不活动后,   服务器向客户端发送一个小的10字节探测包。如果这   数据包未确认,连接将被关闭......

下次我得到DBA的注意时,我将不得不让他们改变这个值,看看它是如何影响事情的。在第二个链接的后面,他们说:

  

如果SQLNET.EXPIRE_TIME小于FW连接空闲   超时,然后防火墙会将此数据包视为活动,并且   空闲超时(防火墙停电)永远不会发生,直到两者都有   客户端和服务器进程都还活着。

我希望这正是我们所需要的。

答案 1 :(得分:1)

  1. 首先,您应该检查您的alert.log,以查找期间的任何错误 这次。
  2. 然后,两种方式可以使您的活动会话断开连接 (1)SQLNET.EXPIRE_TIME&lt; 120
    (2)init参数resource_limit为true,您的配置文件(dba_users + dba_profiles)idle_time&lt; 120

答案 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