インフラエンジニアは人間じゃない

インターネットの闇、炎上ネタ、迷惑メールや詐欺、あらゆる危険な情報を扱うブログです。

MENU

Oracleで行ロックしているセッションの切断方法

こんにちは。

データベースアドミニストレータのねるです。

体はDBで出来ています。

 

Oracle(というかデータベース全般)を使用していて悩みになるのが、行ロックですよね。

行ロックというのは、Oracleが更新する行を丸ごとロックしてしまい、他のセッションに更新させないようにする処理のことです。

データベースの整合性を保つために必要な処理なのですが、時に厄介な処理となってしまいます。

 

行ロック自体は悪い処理ではありません。先ほど述べた通り、むしろDBの整合性を担保するために必要不可欠です。

ただ、行ロックをする処理が何らかの原因で長時間に及んでしまった場合、同じ行を更新しようとする別のセッションはひたすら待ってしまいます。

そんな時に、行ロックをさせている処理を切断したい場合があります。

前段が長くなってしまいましたが、今回はOracleで行ロックしているセッションの切断方法を紹介します!

 

sqlplusを起動する
sqlplus /nolog

sysユーザで接続する
conn / as sysdba

ロックを発生されている元セッションを特定する
select sid  from v$lock where block=1;
複数回実行し、常に表示されるSIDが行ロックしているセッション

上記コマンドで表示されたSIDのSERIAL#を表示する
select SID,SERIAL# from v$session where sid=[上記コマンドで表示されたSID];
SID,SERIAL# を指定して、セッションKILL コマンド実行する
alter system kill session '[上記コマンドで表示されたSID],[上記コマンドで表示されたSERIAL#]';

 <例>

  alter system kill session '1234,5678';
セッションが切断されたことを確認する
select status from v$session where sid=[5.でKILLしたSID];

「行が選択されませんでした。」or「KILLED」と表示されればOK!
Windows環境では暫くKILLED の状態が続きますが、タイムアウトすると消えます。

 

Oracleで行ロックしているセッションを切断する方法は以上です!

皆さんのお役に少しでも立てれば嬉しいです。それでは!