バッチプログラムの開発中などで、(不具合とかで)バッチが終了しないまま放置されたり、
重いバッチをどんどこ実行しまくってセッションが溢れかえったりするのはあるあるですよね。
そんな時に、指定した条件に当てはまるセッションを一気に(正確には2手間で)一掃する方法です。
まずは以下のSQLを実行します。
SELECT DISTINCT
'ALTER SYSTEM KILL SESSION ''' || SID || ', ' || SERIAL# || ''' IMMEDIATE;' AS COMMAND
FROM
V$SESSION
WHERE
TYPE <> 'BACKGROUND'
AND LOGON_TIME <= '2018/7/1' -- ログインした日付で絞り込む
--AND USERNAME = '' -- ログインユーザで絞り込む
--AND MACHINE = '' -- ログインしているクライアント端末で絞り込む
--AND STATUS = 'INACTIVE' -- セッションの状態で絞り込む
--AND PROGRAM = 'A5M2.exe' -- 接続しているアプリケーションで絞り込む
;
コメントにある様に、条件を指定して絞り込みを行います。
例えば、特定のマシンから実行されているセッションのみも可能です。
(例の場合は2018/7/1以前にログインしたセッション全て)
バックグラウンドはKILLしてはいけません。
実行結果は以下の様になります。
COMMAND |
---|
ALTER SYSTEM KILL SESSION '123, 456' IMMEDIATE; |
今度はこのCOMMAND
列の内容で実行するだけです。
セッションを大量にKILLするパターンはだいたい開発環境なのでIMMEDIATE
を指定しています。
これを指定しないと、何らかのエラーがあった場合にセッションは切れているけど、
サーバプロセスが死んでいない状態になることがあります。
(というより死なない事の方が多い気がします)
本番環境では指定しない方が無難です。
※特定のセッションを切れるからといって、向かいのあの子をちょっと驚かせてやろうなどと悪戯に使ってはいけません!
セッションと一緒に縁も切れてしまいます。