ORA-00054が発生したときの原因の特定と対処方法

■概要

DDL等の操作を実行しようとした際、 「ORA-00054」が発生いたしました。
ORA-00054は他のセッションによるロックが原因なので、ロックを解除することが解決策となります。

■ロックとは?

Oracleはエンキューロックを使用し、オブジェクトの保護を行います。
ロックの目的は複数のセッションから同時にデータが変更されないように保護することです。
「HWエンキュー」「SQLエンキュー」「TXエンキュー」「TMエンキュー」などの種類が存在します。



TXは行ロック、TMは表ロックのことであり SELECT文以外の処理を実行した場合は必ず獲得されます。
目的はデータを更新中にDDLを実行させないためです。



■原因調査

まずはロック原因の調査が必要となります。
今回はTXエンキュー、TMエンキューにあたりをつけてロックしているプロセスを調査しました。
理由はORA-00054が発生する前にUPDATE文を実行していたのと、今まさに表をDROP(DDL)しようとしていたからです。

下記SQL文にてロックしているプロセスを参照することができます。

select sid, serial# from v$session
where sid in (select sid from v$lock where type in ('TM', 'TX')
);

v$sessionと呼ばれる現在のセッション情報を提供してくれるビューから「v$lock表のTMまたはTXタイプに該当するsid」を参照しています。

SIDとは・・・セッション識別子のこと。セッションに対してIDを紐づけ、識別する。
SERIAL#とは・・・ セッション・シリアル番号。セッションのオブジェクトを一意に識別するために使用される。 SIDと組み合わせ一意にする目的

■解決策

事象を解決するには、「ロック解除を待つ」または「ロックを強制的に解除する」の二択になります。

今回は、強制解除をしていこうと思います。
先程の調査の結果、SID = 266 と SERIAL# = 27484であることが判明いたしました。
下記の構文に組み込み、セッションをキルしちゃいます。

alter system kill seission 'SID, SERIAL#';

■まとめ

ここまで読んでくださりありがとうございました!

今回はDDLを実行しようとしたらORA-00054が発生し、実際に取った対処についてまとめさせていただきました。

ポイントは「ロック」について知ることだと思います。
ロックされてるとこういうことが起きるんだなーというのを理解して帰っていただければと思いました。

以上、ありがとうございました!

■参考にさせていただいたサイト

▼ORACLE逆引きノート様
https://oracle.programmer-reference.com/ora-00054/


▼津島博士のパフォーマンス講座 第18回 ロックについて
https://www.oracle.com/technetwork/jp/database/articles/tsushima/tsm18-1610822-ja.html

シェアする

  • このエントリーをはてなブックマークに追加

フォローする