【问题标题】:ORA-03150: end-of-file on communication channel for database linkORA-03150: 数据库链接的通信通道上的文件结尾
【发布时间】:2018-06-07 23:03:42
【问题描述】:

在 Oracle 数据库中,定期执行一个大型 PL/SQL 过程,该过程通过数据库链接将数据从一个数据库复制到另一个数据库,几个小时后它失败并出现以下错误:

ORA-03150: end-of-file on communication channel for database link 
ORA-02063: preceding line from DBPREMOTE 
ORA-06512: at "DBLOCAL.JOB_NAME", line 710 
...
ORA-06512: at line 1 

第 710 行是程序的第一行:

 execute immediate 'set constraints all deferred';

然后该过程会执行一些插入和更新,我猜由于 PK、数据无效或其他任何原因,这些操作在某些时候会失败。我猜异常指向那条线是因为它是第一个,而不是因为它实际上在那里失败了,但我不确定真正的异常。

我是否有机会获得真正的异常以便处理它?

【问题讨论】:

  • 与 INSERT 失败相比,您的网络稍微不稳定的可能性更大。如果 INSERT 失败,您仍然会收到与此相关的错误(您可以对此进行测试 - 不要假设!)
  • 这是一个分布式事务,所以第一步是在远程服务器上的alert.log 中查找更多详细信息。这应该可以为您提供足够的信息来了解交易失败的原因。
  • 我们刚刚收到了 alert.log 的详细信息,我们在本地数据库中得到:TNS-12535: TNS:operation timed out ns secondary err code: 12560 nt main err code: 505 TNS-00505: Operation timed out nt secondary err code: 110 nt OS err code: 0,远程服务器的 alert.log 中没有任何内容。所以我们倾向于认为这是本地程序中的一些东西。我猜2h后超时是正常的。
  • 会不会是execute immediate 'set constraints all deferred'; 花费的时间超过了超时时间?

标签: sql oracle exception database-link


【解决方案1】:

一个潜在的解决方法是在每次使用后关闭 DB-Link,使用如下 PL/SQL 过程:

FOR aLink IN (SELECT * FROM V$DBLINK) LOOP
    DBMS_SESSION.CLOSE_DATABASE_LINK(aLink.DB_LINK);
END LOOP;

DECLARE
    DATABASE_LINK_IS_NOT_OPEN EXCEPTION;
    PRAGMA EXCEPTION_INIT(DATABASE_LINK_IS_NOT_OPEN, -2081);
BEGIN
    DBMS_SESSION.CLOSE_DATABASE_LINK('DBPREMOTE ');
EXCEPTION 
    WHEN DATABASE_LINK_IS_NOT_OPEN THEN 
        NULL;
END;

如果连接断开,您应该与您的网络人员交谈。也许他们通过防火墙设置断开连接。但是,可能还有很多其他原因。

【讨论】:

  • 是的,问题是连接超时,可以通过此解决方法解决此问题,但某些原因导致该过程太慢,导致链接超时。
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多