読者です 読者をやめる 読者になる 読者になる

小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracle 11gでテーブルをロックしたままのセッションを削除する

はじめに

Oracleのテーブルをロックするようなプログラムを作成中に、ロールバック処理に不備があるとテーブルがロックされたままになってしまいます。
こうなってしまった場合に、ロックしているセッションを強制的に終了させる方法をまとめました。

機能で学ぶ Oracle Database入門
翔泳社 (2013-10-30)
売り上げランキング: 23,228

ロックしているセッションを特定する

ロックをつかんでいるセッションを特定するには、以下のサイトに記載されているSQLを使います。
このSQLでは、テーブルをロックしているセッションのSIDとシリアルNoを知ることができます。

Oracleでテーブルロックしているsessionを殺す - QiitaOracleでテーブルロックしているsessionを殺す - Qiita

ロックしているセッションを終了させる

セッションのSIDとシリアルNoが分かったら、以下のSQLでセッションを強制終了させます。

--alter system kill session 'SID,シリアルNo' IMMEDIATE;
alter system kill session '22,164' IMMEDIATE;
実際やってみる

1.SQL*Plusをたちあげて、table01テーブルをロックします。

select * from table01 where id = '1' for update;

2.sysユーザでログインして、テーブルをロックしているセッションを特定します。

conn sys/OraclePW1234 as sysdba
SELECT
  object_name,
  oracle_username,
  s.sid,
  s.serial#
FROM v$locked_object l,
  dba_objects o, 
  v$session s
WHERE l.OBJECT_ID = o.OBJECT_ID
  AND l.SESSION_ID = s.SID
  AND object_name = 'TABLE01'
;

f:id:replication:20140616015748p:plain
3.SIDとシリアルNoを指定して、セッションをkillします。

alter system kill session '22,164' IMMEDIATE;
>システムが変更されました。

ちなみに、セッションをkillされたプロセスは接続が切れた状態になるため、コンソールから何かしようとした場合は、以下のようなメッセージが表示されます。

select * from table01 where id = '1' for update
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました
プロセスID: 2288
セッションID: 22、シリアル番号: 179