客先のシステムで使用しているOracle11gにて
下記のエラーが出るようになりました。
「ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能な
ハンドラを検出できませんでした」
エラーコードで検索してみたところ
接続中のセッション・プロセス数が上限値を超えた場合に
このエラーが出るとのことでした。
たしかに、DBを導入した当初に比べると、同DBを使用するシステムが
どんどん増えてきています。
エラーを回避するための1つの対策として
プロセス数上限値(デフォルトは150)を増やすことが書いてありましたが
増やすことによって負荷がかかる可能性もあるため
とりあえずは、上記のエラーが出た際の接続状況を取得してみることにしました。
■セッション・プロセスの現在数と上限を取得
SELECT
RESOURCE_NAME リソース名,
CURRENT_UTILIZATION 現在数,
MAX_UTILIZATION 最大数,
LIMIT_VALUE 上限
FROM
V$RESOURCE_LIMIT
WHERE
RESOURCE_NAME IN (‘processes’,’sessions’);
■セッションの詳細を取得
SELECT
S.machine,
TO_CHAR(S.LOGON_TIME, ‘YYYY/MM/DD HH24:MI:SS’) LOGON_TIME,
S.sid,
S.serial#,
P.PID ORACLE_PID,
P.SPID OS_PID,
S.STATUS,
S.USERNAME ORACLE_USER,
S.OSUSER OS_USER,
S.TERMINAL,
S.PROGRAM
FROM
V$PROCESS P
LEFT OUTER JOIN V$SESSION S
ON P.ADDR = S.PADDR
WHERE
P.BACKGROUND IS NULL AND
P.PID > 1
ORDER BY
TO_CHAR(S.LOGON_TIME, ‘YYYY/MM/DD HH24:MI:SS’),
S.machine;
このエラーは、接続数が減っていくと自然に解消されるため、
ユーザ側には「ただいま大変混み合っております。」のエラーメッセージを
表示することにし、
プロセス数上限値を増やすかどうかは、サーバ側の性能も考慮して
検討することにしました。