潜伏バグからのロングフリーズ

Javaっぽいエンジニアの徒然草

ORA-02049発生時の対処法

■概要

アプリサーバを起動して大量データを扱うバッチを実行したところ、

マシンリソース不足(多分メモリ)が原因でフリーズした。

15分ぐらい待ってみたものの動き出す気配がなかったので強制終了。

みんな大好き、困ったときのプロセスkill.

そしたらDBにINSERT処理中だったらしく、ロックがかかった状態になった。

 

■発生したエラー

ORA-02049: タイムアウト: 分散トランザクションがロックを待機しています。

 

■参考

http://www.searchman.info/tips/1680.html

http://www.cyberarchitect.net/blog/archives/624

http://d.hatena.ne.jp/hmeguro/20090623/1245770191

 

■ロック原因のセッション抽出

SELECT SID,

  SERIAL#

FROM V$SESSION

WHERE SID IN

  (SELECT SID FROM V$LOCK WHERE TYPE IN ('TM','TX')

  );

 

■ロックの解除

シングルクォーテーションでSID, SERIALを個別に囲むのではなくて、

カンマ区切りらしい。

ALTER SYSTEM KILL SESSION '<SID>, <SERIAL#>';

 

ex) alter system kill session '123, 45';

※DBA権限が必要

 

■やってみた

DBA権限が必要と記載されていたのでDB管理者に依頼する必要があったのだけれど、

(依頼が面倒だったので)駄目元で流してみたら成功してしまった...

アプリで共有している一般ユーザで実行したはずなのになんでだろう。

まさか共有ユーザがDBA権限を…?

流石にそれは無いと思いたいので、他に理由があるのかなー。