sql >> データベース >  >> RDS >> Oracle

実行中のSELECTステートメントを強制終了する方法

    結果のページを取得し続けると、SQL*Plusでセッションを開始したと思います。もしそうなら、簡単なことは ctrlをbashすることです + break 止まるまで何度も何度も。

    より複雑でより一般的な方法を、凶暴性/悪の昇順で以下に詳しく説明します。最初のものはおそらくあなたのために働くでしょう、しかしそれがうまくいかないならあなたはリストを下に移動し続けることができます。

    これらのほとんどは推奨されておらず、意図しない結果をもたらす可能性があります。


    1。 Oracleレベル -データベース内のプロセスを強制終了します

    ObiWanKenobiの回答とALTERSESSIONドキュメントによる

    alter system kill session 'sid,serial#';
    

    sidを見つけるには 、セッションID、およびserial# 、シリアル番号、次のクエリ(OracleBaseから要約)を実行して、セッションを見つけます。

    select s.sid, s.serial#, p.spid, s.username, s.schemaname
         , s.program, s.terminal, s.osuser
      from v$session s
      join v$process p
        on s.paddr = p.addr
     where s.type != 'BACKGROUND'
    

    RACを実行している場合は、複数のインスタンスinst_idを考慮に入れるために、これを少し変更する必要があります。 それらを識別するものです:

    select s.inst_id, s.sid, s.serial#, p.spid, s.username
         , s.schemaname, s.program, s.terminal, s.osuser
      from Gv$session s
      join Gv$process p
        on s.paddr = p.addr
       and s.inst_id = p.inst_id
     where s.type != 'BACKGROUND'
    

    このクエリは、RACを実行していない場合にも機能します。

    PL / SQL Developerなどのツールを使用している場合は、セッションウィンドウもそのツールを見つけるのに役立ちます。

    少し強力な「kill」の場合は、トランザクションが完了するのを待たないようにデータベースに指示するIMMEDIATEキーワードを指定できます。

    alter system kill session 'sid,serial#' immediate;
    

    2。 OSレベル - SIGTERMを発行します

    kill pid
    

    これは、Linuxまたは別の*nixバリアントを使用していることを前提としています。 SIGTERM オペレーティングシステムから特定のプロセスへの終了信号であり、実行の停止を要求します。プロセスを正常に終了させようとします。

    これを間違えると、重要なOSプロセスが終了する可能性があるため、入力するときは注意してください。

    pidを見つけることができます 、プロセスID、次のクエリを実行します。これにより、プロセスの実行元のターミナルや実行中のユーザー名などの有用な情報もわかるため、正しいものを確実に選択できます。

    select p.*
      from v$process p
      left outer join v$session s
        on p.addr = s.paddr
     where s.sid = ?
       and s.serial# = ?
    

    繰り返しになりますが、RACを実行している場合は、これを次のように少し変更する必要があります。

    select p.*
      from Gv$process p
      left outer join Gv$session s
        on p.addr = s.paddr
     where s.sid = ?
       and s.serial# = ?
    

    whereを変更する where s.status = 'KILLED'の句 まだ「実行中」の、すでに強制終了されたプロセスを見つけるのに役立ちます。

    3。 OS - SIGKILLを発行します

    kill -9 pid
    

    同じpidを使用する あなたは2で拾いました、 SIGKILL オペレーティングシステムから特定のプロセスへの信号であり、プロセスを即座に終了させます。もう一度入力するときは注意してください。

    これが必要になることはめったにありません。 DMLまたはDDLを実行していた場合、ロールバックの処理が停止され、可能性があります 障害が発生した場合にデータベースを一貫した状態に回復することを困難にします。

    残りのすべてのオプションはすべてのセッションを強制終了し、データベース(6および7サーバーの場合も同様)が使用できなくなります。どうしても必要な場合にのみ使用してください...

    4。 Oracle -データベースをシャットダウンします

    shutdown immediate
    

    これは実際にはSIGKILLよりも丁寧です ただし、明らかに、特定のプロセスではなく、データベース内のすべてのプロセスに作用します。 常に データベースに礼儀正しくするのは良いことです。

    データベースのシャットダウンは、DBAがある場合は、DBAの同意がある場合にのみ実行する必要があります。データベースを使用している人にも伝えるのはいいことです。

    データベースを閉じ、すべてのセッションを終了し、rollbackを実行します コミットされていないすべてのトランザクション。ロールバックする必要のあるコミットされていない大規模なトランザクションがある場合は、しばらく時間がかかることがあります。

    5。 Oracle -データベースをシャットダウンします(あまり良い方法ではありません)

    shutdown abort
    

    これは、 SIGKILLとほぼ同じです。 、ただし、データベース内のすべてのプロセスでもう一度。これは、すべてをすぐに停止して死ぬというデータベースへのシグナルです-ハードクラッシュです。すべてのセッションを終了し、ロールバックは行いません。このため、データベースのstartupに時間がかかる可能性があります。 また。扇動的な言葉にもかかわらず、shutdown abort 純粋な悪ではなく、通常は安全に使用できます。

    以前と同様に、最初に関係者に通知します。

    6。 OS -サーバーを再起動します

    reboot
    

    もちろん、これによりデータベースだけでなくサーバーも停止するため、DBA、開発者、クライアント、ユーザーに加えて、システム管理者の同意を得て、注意して使用してください。

    7。 OS -最終段階

    再起動が機能しませんでした...この段階に達したら、VMを使用していることをお勧めします。削除してしまいました...



    1. MariaDBの「エラー1054(42S22):「on句」の不明な列「…」」を修正

    2. Oracleで2つのタイムスタンプの差を計算する方法

    3. T-SQL-=とasを使用したエイリアシング

    4. Oracleでカレンダーテーブルにデータを入力する方法は?