web-dev-qa-db-ja.com

Oracleで5分以上実行されているすべてのセッションを強制終了するプロシージャ/ジョブを作成する方法

Oracleで5分以上実行されているすべてのセッションを強制終了するプロシージャ/ジョブを作成する方法

それで、v $ sessionをクエリし、特定のユーザー、プログラムのペアがセッションが5分以上アクティブである場合は、それを強制終了することを確認します。

また、そのペアに対してこの手順を5分まで1分ごとに実行するジョブを作成し、(sidによって)プロセスを強制終了する方法も説明します。

create or replace procedure kill_session( p_sid in number, p_serial# in number )
as
begin
    for x in ( select *
                 from v$session 
                where username = USER
                  and sid = p_sid
                  and serial# = p_serial# )
    loop
        execute immediate 'alter system kill session ''' || 
                 p_sid || ',' || p_serial# || '''';
        dbms_output.put_line( 'Alter session done' );
    end loop;
end;

セッションが5分以上アクティブである場合に時間を確認する方法、および特定のユーザーとプログラムのペアで5分まで実行する方法

2
user3638694

一般に、データベースクエリとDMLを中止することは良い考えではありません。 @ Raj がすでに指摘しているように、セッションを強制終了することも悪い考えです。実際にはさらに悪いことです。

セッションは、(ユーザーのUNDOテーブルスペース内の)UNDOスペースを消費し、テーブルのロックを保持し、一時テーブルスペース内のスペース(行のソートなど)を占有するトランザクションを実行している可能性があります。セッションを終了すると、進行中のトランザクションによって実行されたすべての作業がロールバックされ、すべての取り消しセグメントとロックが解放されます。また、「軽い」セッションはかなり早く終了する可能性がありますが、Oracleエンジンがすべてをクリーンアップするまでに時間がかかるものもあります。

あなたの質問に答えるには、なぜあなたがあなたのセッションを殺しているのかを知る必要があります。

  • 5分を超えて実行を許可すると、ユーザーセッションは多くのリソース(CPU)を消費するためですか?
  • それは、ユーザーがセッションとアイドリングを確立しすぎたためですか?
  • 新しく確立されたセッションが他のセッションですでに使用されているリソースを枯渇させ、それらを実行できるようにする必要があるためですか?
  • クールなソフトウェアを開発していて、ユーザーが接続を切断する数分前に評価するように制限したいのでしょうか。

おそらく、セッションの終了を回避するようにビジネスロジックを改善できます。たとえば、サーバー側で計算を行うことができます。

または、中間層(アプリケーションサーバー)で実行され、接続プールを使用してデータベースへの適切な少数の接続を維持しながら、ユーザーに代わってクエリを実行するRESTful Webアプリケーションを開発することもできます。たとえば、Java Apache Tomcat JDBC接続プールを使用してサーブレットとJSPを含むWebアプリケーション( Tomcat 8の公式ドキュメント )と記述できます。専用サーバーから切り替えることもできます。 共有サーバーアーキテクチャ を優先するアーキテクチャ。

ソフトウェアが接続プールをサポートしていない場合は、 OCI経由のデータベース常駐接続プール を使用できます。

しかし、私があなたのニーズを満たすことを提案したものがない場合は、データベースリソースマネージャーを使用してリソースプランを実装し、実行中のクエリを中止するディレクティブを定義するか、長時間実行またはアイドル状態のセッションを強制終了することができます。 Oracle Database Resource Managerを使用したリソースの管理 『Oracle Database管理者ガイド』のキーワードはCANCEL_SQLKILL_SESSIONMAX_EST_EXEC_TIMEMAX_IDLE_TIME

2