Oracleエラー対応(ORA-12516):ORA-12516 発生時の対処方法について

現役DBAが解説-Oracleエラー対応

突然ORA-12516のエラーメッセージとともに、これまでは接続できていたデータベースに接続できなくなることがあります。
ORA-12516はデータベースへ接続する時に発生するエラーです。

本記事では、ORA-12516の原因と発生時の対処方法を紹介します。

1.エラーメッセージ

ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能なハンドラを検出できませんでした
ORA-12516: TNS: listener could not find available handler with matching protocol stack.

2.原因

ORA-12516は、リスナーとデータベース間で問題が起こった時に発生するエラーです。
多くの場合、データベースの初期化パラメータ「PROCESSES」や「SESSIONS」に設定した値に到達したことで発生します。
リスナーは、データベースへの接続をディスパッチしていますが、このとき接続数をカウントしています。
しかし、データベースから切断された情報は、LREG/PMONプロセスにより通知されるまで取得することができないため、リスナーが接続数の上限に達したと認識すると、クライアントからの接続要求をブロックするようになり、その際にORA-12516等のエラーとなります。
このためORA-12516は、短い時間で接続/切断を行う処理が大量に実施された時に発生しやすいです。

3.対処方法

上記の原因によるエラーへの対処方法を紹介します。

①初期化パラメータ「PROCESSES」の設定値を増やす

ワークロードに対して、接続数の上限が低い場合に「PROCESSES」パラメータの設定を増やすことでエラーを回避する方法です。
「PROCESSES」パラメータの設定値を増やす場合、サーバのリソース使用量も増加するため設定する際には注意が必要です。

PROCESSESパラメータの変更方法は下記記事を参考にして下さい。
Oracleエラー対応(ORA-00020):ORA-00020発生時の対処方法について

②データベースコネクションクローズの見直し

開発フレームワークの仕組みでデータベースコネクションのクローズに関する問題は減ってきていると思われます。
しかし、そのような仕組みがないアプリケーション開発では、データベースコネクションのクローズ処理が行われていないものはクローズ処理を組み込むように修正します。

③コネクションプールを使用する

コネクションプールを使用して、データベースの前で接続の制御を行います。
これにより、複数のアプリケーションから接続される環境で特定のアプリケーションからの接続が大量発生した際でも、それ以外のアプリケーションの接続を妨げません。

4.最後に

ORA-12516はリスナーとデータベース間で発生するエラーで、その多くが接続数上限に達することで発生します。
適切な接続数を確保できるよう設計・設定をしましょう。