2017-12-27 854 views
0

Oracleデータベースには、データベース・リンクを介してあるDBから別のDBにデータをコピーする、大きなPL/SQLプロシージャが定期的に実行されています。次のエラーといくつかの時間:ORA-03150:データベース・リンク用通信チャネルのファイルの末尾

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、データが有効でないか、または他の理由であれ。私は、例外が実際にそこに失敗しているわけではなく、最初のものであるため、その行を指していると思いますが、実際の例外は確実にわかりません。

実際の例外が発生する可能性はありますか?

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; 

接続がとにかく破棄された場合:

+0

INSERTが失敗するよりも、少しフレークなネットワークがある可能性が高くなります。 INSERTが失敗した場合は、それに関連したエラーがまだ残っています(これをテストすることはできません)。 – Ben

+0

これは分散トランザクションなので、最初のステップは 'alert.log' **リモートサーバー**で。これは、トランザクションが失敗した理由を理解するのに十分な情報を提供するはずです。 – APC

+0

は、私達はちょうどALERT.LOG詳細を受け、我々はなっている: 'TNS-12535を:TNS:505 TNS-00505:12560 がメインERRコードをNT:操作が NS二次ERRコードをタイムアウトになった操作は をタイムアウトしましたローカルのDBに0 0 2番目のエラーコード:110 nt OSエラーコード:0、リモートサーバーのalert.logには何もありません。だから我々はそれがローカル手続きの中の何かであると考える傾向がある。 2時間後のタイムアウトは普通だと思います。 – detoro84

答えて

0

潜在的な問題を回避するには、このようなPL/SQLプロシージャを使用して使用後にDBリンクを閉鎖する可能性がありあなたのネットワークの人と話をする必要があります。おそらく、彼らはファイアウォールの設定によって接続を切断するでしょう。しかし、他にも多くの理由があります。

+0

はい、問題は接続タイムアウトですが、この回避策では修正されますが、何らかの原因でプロシージャが遅れてリンクタイムアウトが発生する可能性があります。 – detoro84

関連する問題