編集/序文: DBリンククエリのタイムアウトに関する質問に特に関心があるため、この質問はSOから移行されました。 SOから提供される回避策は多少問題ありませんが、質問自体に本当に興味があります。
動機:
データベースリンクを使用して、クエリを「永久に」(セッションを終了するまで2日以上)実行しました。問題は、リモートデータベースが利用できなくなり、まだ知られていない理由で_ORA-02068
_が発生せず(ここでは説明しません)、クエリが待機して待機したことです。
(クエリは、PL/SQLパッケージのプロシージャを実行するdbms_schedulerジョブによって発行されます。その結果、ジョブもスタックしました。ただし、この質問の中心には特に関係ありません)
私は、テストDBの1つを静止モードにして、データベースリンクを介してクエリを実行することで、この状況をシミュレートしました。予想どおり、クエリは手動でキャンセルされるか、リモートDBが静止解除されるまで待機していました。
質問:
リモートデータベースの動作と稼働時間を制御できないため、データベースリンクを使用しているクエリにタイムアウトを設定する可能性を模索しています。
私はすでにプロファイル(_CPU_PER_CALL
_など)、_sqlnet.ora
_パラメータを調べ、ローカルネーミングパラメータを接続文字列に直接追加(データベースリンク定義に_(connect_timeout=10)
_を追加するなど)、 _... for update wait 1
_を指定したコマンドですが、ビジーまたはアイドルセッションでは機能しますが、待機中のセッションでは機能しません。
したがって、データベースリンクの「ローカル」側で、データベースリンクを介したクエリのタイムアウトを設定するオプションを探しています。
これらの特定のDBに対するDBA権限がないので、_alter session set xyz
_やselect ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)
などの解決策がありがたいです。
私は現在10gR2を使用していますが、数週間で11gR2にアップグレードするので、これらのバージョンのアイデアは役に立ちます。
Dbms_schedulerを使用しているため、ジョブのmax_run_durationattribute をいくつかの制限に設定してから、スケジューラを使用できますそのイベントが発生した場合はメールでお知らせします。 Oracleは舞台裏でキューテーブルを使用します(応答をさらに自動化するために追加の手順を実行したい場合は、 イベントが発生した のときに起動するジョブを作成できます)。ただし、基本的には、設定したmax_run_durationを超えて実行されるジョブはすべて、次のイベントタイプを発生させます。JOB_OVER_MAX_DUR
メールの一部は11gr2に組み込まれています。詳しくは here を参照してください。
お役に立てば幸いです。
私が解決策を持っていると言っているわけではありませんが、dblinkタイムアウトを制御する方法についてもっと議論したいです。イベントを起動するコード、またはTNSタイムアウトイベントを待機して実行するコードを記述することが考えられます。
ALTER SESSION CLOSE DATABASE LINK dblink;
もちろん、前にリモートサーバーをポーリングすることもできます。
select * from dual@dblink
利用可能かどうかを確認しますが、リモートで長時間実行されるコードの問題は修正されません。不正なリモートコードは待機イベントを起動する必要があるため、それらは(12cのクラスレベルでも)トラップされる可能性があります。それでも、dblinkセッションを強制的にタイムアウトさせるエレガントなソリューションは得られません。