web-dev-qa-db-ja.com

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

セッションを強制終了して、実行中のSELECTステートメントを停止するにはどうすればよいですか?

このコマンドは、SELECTステートメントに基づいて継続的に出力を提供します。その間に停止したいです。

46
Ashish Anand

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

より複雑でより一般的な方法は、凶暴性/悪の増加順に以下に詳述します。最初の方法はおそらく動作しますが、動作しない場合はリストを下に移動し続けることができます。

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


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

ObiWanKenobi's answer および ALTER SESSION ドキュメントに従って

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

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

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

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

4.Oracle- シャットダウン データベース

shutdown immediate

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

データベースのシャットダウンは、DBAがいる場合、DBAの同意がある場合にのみ行ってください。データベースを使用する人にも伝えるのは良いことです。

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

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

shutdown abort

これはSIGKILLとほぼ同じですが、データベース内のすべてのプロセスでもう一度実行されます。これはデータベースへのシグナルであり、すべてを即座に停止して停止します-ハードクラッシュ。すべてのセッションを終了し、ロールバックしません。このため、データベースが startup に再び時間がかかることを意味します。焼cen的言語にもかかわらず、shutdown abortは純粋な悪ではなく、通常は安全に使用できます。

前と同様に、最初に関係者に連絡します。

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

reboot

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

7.OS-最後のステージ

再起動しませんでした...この段階に到達したら、VMを使用していることを望みます。削除してしまいました...

70
Ben

これは私が使用するものです。セッションとユーザーを見つけるために、この最初のクエリを実行します。

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';

これにより、同じユーザーに複数のセッションがあるかどうかがわかります。次に、通常、セッションがデータベースをブロックしているかどうかを確認します。

SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;  

次に、ALTERステートメントを実行して、この形式の特定のセッションを強制終了します。

ALTER SYSTEM KILL SESSION 'sid,serial#'; 

例えば:

ALTER SYSTEM KILL SESSION '314, 2643';
4
James Drinkard

セッション全体を強制終了する必要はありません。 Oracle 18cでは、 ALTER SYSTEM CANCEL を使用できます。

セッションでのSQL文のキャンセル

ALTER SYSTEM CANCEL SQLステートメントを使用して、セッション内のSQLステートメントをキャンセルできます。

セッションを終了する代わりに、セッション内の高負荷SQLステートメントをキャンセルできます。 DMLステートメントをキャンセルすると、ステートメントはロールバックされます。

ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';

@INST_IDが指定されていない場合、現在のセッションのインスタンスIDが使用されます。

SQL_IDが指定されていない場合、指定されたセッションで現在実行中のSQLステートメントは終了します。

3
Lukasz Szozda

Oracleでセッションを強制終了するには、ALTER SYSTEM KILL SESSIONコマンドを使用します。

詳細はこちら: http://www.Oracle-base.com/articles/misc/KillingOracleSessions.php

2
ObiWanKenobi

ああ!問題のコメントを読んでください。しかし、他の人に役立つ場合に備えて、答えをここに置いてください

「Ctrl + C」と「Ctrl + Break」を試してみましたが、どれも機能しませんでした。 Oracle Client 10.2.0.1.0に付属のSQL Plusを使用していました。 SQL Plusは、ほとんどの場合、Oracle DBに接続するためのクライアントとして使用されます。 [ファイル]メニューの[キャンセル]オプションを使用すると、実行が停止しました。

File Menu, Oracle SQL*Plus

[ファイルを数分間待つ]をクリックすると、選択コマンドが停止し、[キャンセル]をクリックしてメニューが表示されます。

0
Shiva