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権限を…?
流石にそれは無いと思いたいので、他に理由があるのかなー。