客戶端連接報錯:
ORA-12516: TNS: 監聽程序無法找到匹配協議棧的可用句柄
-- 1. 查看當前會話數與參數值
SELECT COUNT(*) FROM v$session; -- 當前 45
SHOW PARAMETER processes;
-- processes = 50
SHOW PARAMETER sessions;
-- sessions = 60 (衍生值 ≈ 1.1*processes+5)
-- 結論:會話數逼近上限,需擴容
-- 修改 SPFILE(持久化)
ALTER SYSTEM SET processes = 300 SCOPE = SPFILE;
ALTER SYSTEM SET sessions = 300 SCOPE = SPFILE; -- 通常同步調整
-- 重啟數據庫
SHUTDOWN IMMEDIATE;
STARTUP;
-- 驗證
SHOW PARAMETER processes; -- 300
SHOW PARAMETER sessions; -- 335 (自動衍生 1.1*300+5)
sessions ≈ 1.1 * processes + 5transactions ≈ 1.1 * sessionsprocesses 需重啟;sessions 若手動設定也需重啟每個 Oracle 進程消耗一個信號量,processes 增加必須同步調大 OS 信號量與共享內存參數,否則實例無法啟動。
| 參數 | 建議值計算 | 說明 |
|---|---|---|
| SEMMNI | ≥ processes + 10 | 信號量集標識符最大數 |
| SEMMSL | ≥ processes + 10 | 每個信號量集最大信號量數 |
| SEMMNS | Σ(所有實例 processes) + 2×max(processes) + 10×實例數 | 系統全局最大信號量總數 |
| SEMOPM | ≥ 100 | 單次 semop 最大操作數 |
| SHMMAX | 物理內存 50% (bytes) | 單個共享內存段最大值 |
| SHMMNI | 4096 | 共享內存段標識符最大數 |
| SHMALL | SHMMAX / PAGE_SIZE | 共享內存總頁數 |
# /etc/sysctl.conf
kernel.sem = 350 32000 100 400 # SEMMSL SEMMNS SEMOPM SEMMNI
kernel.shmmax = 8589934592 # 8GB (假設 16GB 物理內存)
kernel.shmmni = 4096
kernel.shmall = 2097152 # 8GB / 4KB
# 生效
sysctl -p
smit → System Environments → Change/Show Characteristics → IPCkctune semmns=... semmni=... shmmax=.../etc/system 加 set semsys:seminfo_semmns=...注意: OS 參數修改需**重啟操作系統**生效。
Desktop Heap 大小(注冊表 SharedSection),高併發場景可能需調大V$RESOURCE_LIMIT、V$SESSION、V$PROCESS-- 監控資源上限使用率
SELECT resource_name, current_utilization, max_utilization, limit_value
FROM v$resource_limit
WHERE resource_name IN ('processes','sessions');
-- 模擬併發測試(示例)
for i in {1..200}; do sqlplus user/pwd @test.sql & done
| 層面 | 動作 | 生效方式 |
|---|---|---|
| 數據庫 | ALTER SYSTEM SET processes=XXX SCOPE=SPFILE | 重啟實例 |
| 數據庫 | ALTER SYSTEM SET sessions=XXX SCOPE=SPFILE | 重啟實例 |
| Linux/Unix OS | 調整 kernel.sem / kernel.shmmax 等 | 重啟 OS |
| Windows OS | 通常無需調整,關注 Desktop Heap | 重啟 OS |
| 應用層 | 配置連接池最大值 < 0.8×processes | 應用重啟 |
V$RESOURCE_LIMIT 歷史峰值,科學規劃上限