我有一个带有过程的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秒)发送第一个保持活动的探针时,它会发现连接不再活动,并关闭连接并返回脚本。
我不明白为什么数据库系统会放弃连接?数据库结束时是否有任何设置来增加详细内容?或者这是否与某些防火墙设置有关?另外,在2小时10分钟内,我们可以猜到2小时的部分来自tcp_keepalive_time,即10分钟的部分。有数据库方面的重试吗?
编辑:DBA和我查看了这个问题,我看到了在我的末尾建立的TCP连接,他没有看到任何连接来自我这边。
发布于 2017-06-06 00:54:00
我们有类似的地方,我们的防火墙在大约两个小时后放弃我们的Pro*C连接,如果我们在这段时间内没有任何活动。我们的解决办法是:
select 1 from dual;每15分钟在每个数据库连接上保持活动状态。
如果我没记错的话,只有当连接具有与SO_KEEPALIVE的setsockopt调用时,才会使用上面提到的tcp保持活动时间。由于与Oracle的实际连接是由Oracle管理的,因此我们无法知道是否设置了它。
在查看这个文件时,我在网上看到了一些地方(这和这)在$ORACLE_HOME/network/admin/sqlnet.ora文件中引用了sqlnet.expire_time=minutes_to_check。他们说:
在此参数到位后,在10分钟的不活动之后,服务器向客户端发送一个小的10字节探测包。如果这个包不被确认,连接就会关闭.
下一次当我得到我们DBA的注意时,我将不得不让他们改变这个值,看看它是如何影响事物的。在第二个链接的后面,他们说:
如果SQLNET.EXPIRE_TIME小于FW连接空闲超时,则防火墙将将此数据包视为活动,而空闲超时(防火墙停电)将永远不会发生,直到客户端和服务器进程都处于激活状态。
我想这正是我们所需要的。
发布于 2017-06-06 02:42:35
发布于 2017-06-06 03:10:06
通信通道上的文件结束很少是DB端的问题.如果您怀疑DB方面的问题,那么通过gv$session监视会话活动。您将能够立即了解会话是“挂起”还是在特定语句上长期运行。松掉到DB的连接并不少见,特别是在网络不稳定的情况下。
https://stackoverflow.com/questions/44378281
复制相似问题