web-dev-qa-db-ja.com

ユーザーのすべてのアクティブおよび非アクティブなOracleセッションを強制終了する方法

ユーザーのすべてのアクティブおよび非アクティブなOracleセッションを一度に強制終了するために以下のスクリプトを試していますが、機能しません。スクリプトは正常に実行されますが、ユーザーのセッションは強制終了されません。

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;
19
Andrew

KILL SESSIONコマンドは、実際にはセッションをkillしません。セッションに自分自身を殺すように要求するだけです。リモートデータベースからの応答を待機したり、トランザクションをロールバックしたりする場合など、状況によっては、セッションはすぐには終了せず、現在の操作が完了するまで待機します。これらの場合、セッションは「killマーク」のステータスになります。その後、できるだけ早く殺されます。

ステータスを確認して確認します。

SELECT sid, serial#, status FROM v$session;

[〜#〜] immediate [〜#〜]句も使用できます。

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

IMMEDIATE句は、コマンドによって実行される作業には影響しませんが、killの確認を待つのではなく、すぐに現在のセッションに制御を戻します。 Killing Oracle Sessions をご覧ください。

Updateすべてのセッションを強制終了する場合は、小さなスクリプトを準備するだけで済みます。

SELECT 'ALTER SYSTEM KILL SESSION '||sid||','||serial#||';' FROM v$session;

Spool上記の.sqlファイルして実行します。

19
Lalit Kumar B
BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;

これは動作するはずです-immediateキーワードを追加するようにスクリプトを変更しました。前の回答が指摘したように、kill sessionは、強制終了するセッションのみをマークします。すぐには行われませんが、後で便利になります。

あなたの質問から、あなたはすぐに結果を見ることを期待しているように見えました。そのため、immediateキーワードを使用してこれを強制します。

17
noname.c

このスクリプトを実行します。

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';

実行する必要があるSQLを出力します。

4
elkoo
BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' || r.serial# || '''';
  END LOOP;
END;
/

わたしにはできる。

0
chandan gupta

Oracle 11gの場合、以下のようなエラーを受け取る可能性があるため、これは機能しない可能性があります

Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 -  "missing or invalid session ID"
*Cause:    Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action:   Retry with a valid session ID.

これを修正するには、以下のコードを使用してセッションを特定します

SQL> select inst_id,sid,serial# from gv$sessionまたはv $ session

[〜#〜] note [〜#〜]v $ sessionにはinst_idフィールドがない

使用してそれらを殺します

alter system kill session 'sid,serial,@inst_id' IMMEDIATE;
0
Sid133

キルの前日に非アクティブなセッション

begin
    for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
    LOOP
        EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]'  ||i.serial#||q'[']'||' IMMEDIATE');
    END LOOP;
end;
0
Faruk ÇEVİK