今まで元気に動いていたシステムで、突然以下のエラーが発生しました。
TNS-12518: TNS: リスナーはクライアント接続をハンドオフできません。
もう一度同じ処理を動かすと、今度はエラーは発生せず。
見間違いかな?と思って、何度も同じ処理を動かしましたが、エラーが発生したのは一度きりでした。
リスナーログを確認する
リスナーログを確認してみます。Oracleのバージョンは12cだったので、リスナーログは以下のフォルダにありました。
$ADR_BASE\diag\tnslsnr\[ホスト名]\[リスナー名]\trace\[リスナー名].log
ログを確認してみると、確かに一度だけ「TNS-12518」が発生していました。
アラートログを確認する
今度はアラートログを確認してみます。アラートログは以下のフォルダにあります。
$ADR_BASE\diag\rdbms\[DATABASE]\[SID]\trace\alert_[SID].log
アラートログには以下のエラーが出力されていました。
ORA-00020: 最大プロセス数(150)を超えました
どうやらこれがTNS-12518の原因のようです。
プロセス数を確認する
現在使用中のプロセス数と最大数を確認します。以下のSQLを実行することで確認できます。
select * from v$resource_limit
where resource_name in ('processes','sessions');
where resource_name in ('processes','sessions');
<実行結果>
RESOURCE_NAME | CURRENT_UTILIZATION | MAX_UTILIZATION | INITIAL_ALLOCATION | LIMIT_VALUE | CON_ID |
processes | 62 | 148 | 150 | 150 | 0 |
sessions | 72 | 161 | 248 | 248 | 0 |
「CURRENT_UTILIZATION」は、現在使用されているプロセスの数、「MAX_UTILIZATION NUMBER」は最後にインスタンスを起動してからのリソース最大消費量です。
リソース最大消費量が最大値の150に迫るところまで来ていました。
おそらく「MAX_UTILIZATION NUMBER」が148を記録したタイミングでORA-00020が発生したのでしょう。
問題のプログラムを何度も動かすと、「CURRENT_UTILIZATION」の値がどんどん増えていきます。
根本原因
ある担当者が作成したプログラムにバグがあることが判明しました。条件によってDisconnectしないルートが存在したため、プロセスがどんどん溜まってしまう状態となっていたようです。
コネクションの切断処理を全プログラムで見直したところ、「CURRENT_UTILIZATION」の値が増え続けることはなくなりました。
まとめ
ORA-00020が原因でプロセスが強制終了すると、ほかのエラーを併発することがあるようです。最初に発覚した「TNS-12518」だけでは何のエラーなのかよくわかりませんでしたが、アラートログを見ることで根本原因までたどり着くことが出来ました。
まずはアラートログを確認することが基本ですね。
以上
0 件のコメント :
コメントを投稿