連線數耗盡導致 ORA-12516: TNS:listener could not find available handler 或 ORA-00018: maximum number of sessions exceeded。本文說明透過修改 SPFILE 參數 PROCESSES / SESSIONS 調整最大連接數,含檔案定位、參數修改、重啟驗證完整流程。
監聽程序無法為請求的服務類型找到可用的處理程序
ORA-12516 / ORA-00018
%ORACLE_HOME%\database\SPFILE<SID>.ORA (如 SPFILEORCL.ORA)$ORACLE_HOME/dbs/spfile<SID>.orainit<SID>.ora-- 1. 以 SYSDBA 登入確認目前值
SHOW PARAMETER PROCESSES;
SHOW PARAMETER SESSIONS;
-- 2. 修改 SPFILE (靜態參數,需重啟)
ALTER SYSTEM SET PROCESSES = 1500 SCOPE = SPFILE;
ALTER SYSTEM SET SESSIONS = 2250 SCOPE = SPFILE; -- 建議 = PROCESSES * 1.5 + 22
-- 3. 重啟資料庫生效
SHUTDOWN IMMEDIATE;
STARTUP;
-- 4. 驗證新值
SHOW PARAMETER PROCESSES;
SHOW PARAMETER SESSIONS;
| 參數 | 預設值 | 建議設定 | 說明 |
|---|---|---|---|
| PROCESSES | 150 | 業務峰值連線數 + 背景程序 + 余量 | OS 程序上限,靜態參數 |
| SESSIONS | PROCESSES*1.5+22 | PROCESSES * 1.5 + 22 | 衍生自 PROCESSES,靜態參數 |
| TRANSACTIONS | SESSIONS*1.1 | SESSIONS * 1.1 | 衍生自 SESSIONS |
-- 當前會話數
SELECT COUNT(*) FROM V$SESSION;
-- 當前進程數
SELECT COUNT(*) FROM V$PROCESS;
-- 歷史峰值 (需啟用审计或 AWR)
SELECT MAX(CURRENT_UTILIZATION) FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME = 'processes';
若資料庫參數已足夠但仍報錯,檢查 listener.ora:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
(ENVS = "PROCESSES=1500") -- 可選,傳遞給專用服務器
)
)
V$RESOURCE_LIMIT 設定告警閾值 (如 80%)MAX_POOL_SIZE 低於資料庫 PROCESSES 80%
DBA_HIST_RESOURCE_LIMIT (AWR) 規劃擴容THREADED_EXECUTION=TRUE 降低 OS 程序消耗核心原則:PROCESSES/SESSIONS 為靜態參數,**修改必須重啟**。生產環境變更需納入變更管理、預留維護窗口、驗證回滾方案。