セッションを切断

意図的にセッションを切断したい場合 alter system kill session コマンド で
Oracle への接続を強制的に終了させることができる。

残留セッション

例えば、あるセッションで SQL 実行中にフリーズしたが、セッションは
生き残っている場合や、データベースをシャットダウンしたいが接続中の
ユーザが残っている場合などが想定される。

後者の場合、 shutdown immediate なら、トランザクションが終了するのを待たずに
ロールバックしてセッションを切断するからよいが、normal や transactional では
切断されるまで待ちが発生してしまう。このような時に有効。

hoge ユーザのセッションを強制終了させる例

hoge ユーザでログイン

$ sqlplus hoge/hoge@ORCL

管理ユーザでログイン(別窓)

$ sqlplus system/hoge@ORCL

v$session で hoge ユーザの情報を取得

SQL> select sid, serial#, username, program from v$session where username = 'HOGE';

       SID    SERIAL# USERNAME   PROGRAM                  
---------- ---------- ---------- -------------------------
       304        116 HOGE       sqlplus@DBSEV (TNS V1-V3)

hoge ユーザが sqlplus で接続していることが分かる。
(分かりやすくするために1セッションにしているが、複数セッションが貼られている場合は
ログイン時刻や実行 SQL など、絞込み情報を増やすことで識別が容易になる。)

セッション強制終了

セッションを強制終了する場合、SID(セッションID) と SERIAL#(シリアル番号) が
必要になるので確認しておく。今回は SID が 304 、SERIAL# が 116 であることが分かる。

SQL> alter system kill session '304, 116';

システムが変更されました。

再度 v$session を確認してみると、セッションが終了されたことが分かる。

SQL> select sid, serial#, username, program from v$session where username = 'HOGE';

レコードが選択されませんでした。

hoge ユーザのウィンドウに戻り、任意の SQL を実行してみると、エラーが返される。

SQL> select * from dual;
select * from dual
*
行1でエラーが発生しました。:
ORA-00028: セッションは強制終了されました。

関連記事