fc2ブログ

(元)社内SEの徒然なる日記

Oracleのロックの確認とセッションの切断をしてみた【成功】

■ 処理が終わらない

ある日、ユーザーから伝票の更新処理がいつまでたっても終わらないと連絡が来ました。Webシステムと言う関係上、たまにサーバとの切断が切れて同じような現象になったりするのですが、伝票画面を開きなおしても状況が変わらないそうです。

結局、DB(Oracle)でロックが掛ったままになっていたことが原因のようなので、強制的にセッションを切断することにしました。

■ ロックの確認

まず、ロックされているセッションの一覧を表示します。ロックは、V$LOCKED_OBJECTから探せるようです。後でセッションを切断するのに必要な情報(セッション識別子とシリアル番号)は、V$SESSIONから取得します。

-- Oracleのロックを取得するSQL
SELECT
TO_CHAR(S.LOGON_TIME,'YYYY/MM/DD HH24:MI:SS') AS ログイン日時
,L.ORACLE_USERNAME AS Oracleユーザー名
,S.SID AS セッション識別子
,S.SERIAL# AS シリアル番号
FROM
V$LOCKED_OBJECT L
,V$SESSION S
WHERE
L.SESSION_ID = S.SID
ORDER BY
1
,3


もう少し工夫すれば対象のオブジェクトの絞り込みも出来るのですが、私が管理しているシステムは、日中に長時間かかる処理が存在しません。なので、ログイン日時が分れば無駄にロックされているものが分かります。

結果は、こんな感じ。
Oracleのロックの解除

この時の時間は10時頃。DBサーバーは毎日再起動しています。その条件下で見ると、7時のロックが残っているのはちょっと変です。どうやら犯人が見つかったようです。

■ ロックの解除

私はOracle(というかシステム全般)を毎日再起動するようにしています。メーカーなどは、最近は起動しっぱなしでも問題無いと言いますが、私に言わせれば嘘も大概にしろと言いたいです。

実際に、こういう問題が発生するし、そうなっても再起動しておけば対応出来るエンジニアがいなかったとしても、翌日にはロックが解除(DBが再起動されるので、自動的にそうなる)されて問題が解消されます。

なので、放置しても良かったのですが、この日は時間(と心と体に余裕)があったので、手動でロックを解除しました。

-- セッションを切断する
ALTER SYSTEM KILL SESSION
'272, 50867' -- セッション識別子, シリアル番号
IMMEDIATE


ロックの解除は、ALTER SYSTEM KILL SESSION を使用します。上記のように、V$SESSIONから取得したセッション識別子とシリアル番号を指定して実行すれば、それでOKです。

■ 後書き

Oracleのバージョンは、Oracle12cです。2017年頃のサーバーリプレースに合わせて当時の最新バージョンにしたのですが、その辺りからロックが解除されない事象が稀に発生するようになりました。

プログラムは変えていないので、Oracle側の何らかのバグのような気がします。ただ、調査を始めると手間暇かかるし、パッチを当てても、それで新たな問題が発生する気もするので、このまま塩漬けにしようかと。

感覚的な話ですが、どうもOracle12cはバグが多い気がします。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する