ユーザーのすべてのアクティブおよび非アクティブな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;
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
ファイルして実行します。
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
キーワードを使用してこれを強制します。
このスクリプトを実行します。
SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;'
FROM v$session
where username='YOUR_USER';
実行する必要があるSQLを出力します。
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;
/
わたしにはできる。
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;
キルの前日に非アクティブなセッション
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;