大家好,這里是公眾號 DBA學習之路,分享一些學習數據庫路上的知識和經驗。

目錄
前言
今天有一套 Windows Oracle 數據庫會話滿了,連接報錯 ORA-00020: maximum number of processes (2000) exceeded,應用無法連接。
ORA-00020 介紹
首先,我們通過 Oracle 工具查看該錯誤的官方解釋:
$ oerr ora 00020
00020, 00000, "maximum number of processes (%s) exceeded"
// *Cause: All process state objects are in use.
// *Action: Increase the value of the PROCESSES initialization parameter.
關鍵參數說明:
PROCESSES:定義了能夠同時連接到數據庫實例的最大操作系統進程數量。每個成功的客戶端連接都會對應一個服務器進程,此參數限制了這些進程的總數。SESSIONS:定義了數據庫允許的最大并發會話數。其默認值通常由公式(1.1 * PROCESSES) + 5自動計算得出。因此,當進程數達到上限時,會話數限制也會同步觸發,新的數據庫連接將無法建立。
ORA-00020 錯誤通常由以下幾類原因引起:
- 應用程序連接池泄漏:連接池配置不當或代碼缺陷導致連接未正確釋放,連接數隨時間持續增長。
- 數據庫參數配置過低:
PROCESSES初始設置未能預估業務增長,無法滿足實際并發需求。 - 異常會話堆積:
- 長時間未提交或回滾的事務。
- 被鎖阻塞的會話鏈,產生大量等待進程。
- 客戶端異常斷開(如網絡中斷、程序崩潰)后,數據庫端會話未能及時清理。
- 監控/管理工具過度占用:如 Oracle Enterprise Manager (OEM)、DBConsole、第三方監控或備份軟件可能創建大量會話。
- 數據庫遭受攻擊或異常訪問:連接風暴(Connection Storm)或惡意程序發起海量連接嘗試。
該錯誤直接影響業務系統的可用性,需立即定位并解決。
問題分析
檢查數據庫當前會話使用情況:
-- 檢查當前會話分布
SQL> set line2222 pages1000
col username for a10
col program for a30
col machine for a30
select username,program,machine,status,count(1) from v$session where username is not null group by username,program,machine,status;
USERNAME PROGRAM MACHINE STATUS COUNT(1)
-------------------- ------------------------------ ------------------------------ -------- ----------
DBSNMP emagent.exe WORKGROUP\WIN-KTMVJAA4QIM ACTIVE 1
SYS sqlplus.exe WORKGROUP\WIN-KTMVJAA4QIM ACTIVE 1
LIS JDBC Thin Client WIN-KTMVJAA4QIM INACTIVE 10
EMR JDBC Thin Client WIN-KTMVJAA4QIM INACTIVE 30
HIS JDBC Thin Client WIN-KTMVJAA4QIM INACTIVE 30
SYSMAN OMS WIN-KTMVJAA4QIM INACTIVE 1896
-- 查看數據庫參數設置
show parameter processes;
show parameter sessions;
SYSMAN 用戶通過 OMS 程序創建了 1896 個 INACTIVE 狀態的會話,幾乎占滿了全部進程資源。而正常的業務用戶(HIS, EMR, LIS)連接數合計僅 70 個,處于合理范圍。
- SYSMAN 是 Oracle Enterprise Manager(EM) 相關的核心管理用戶。
- OMS 程序通常與 Oracle Management Server 或 Database Control(DBConsole)相關聯。
結合環境判斷,這臺 Windows 數據庫服務器很可能默認安裝并啟動了 Oracle Database Control(DBConsole) 服務。
DBConsole 介紹
Oracle Database Control(DBConsole) 是 Oracle 提供的基于 Web 的輕量級數據庫管理工具,它是 Enterprise Manager 的基礎版本,通常隨數據庫軟件默認安裝。主要功能包括:
- 數據庫性能監控與診斷
- 表空間與存儲管理
- 用戶、角色與權限管理
- 基本的備份與恢復操作
在通過 DBCA 建庫時,通常會提示是否配置并啟動 DBConsole:

DBConsole 在運行過程中,有時會因為內部機制或異常狀態產生大量“僵尸”會話,并且這些會話長期處于 INACTIVE 狀態卻不釋放,持續占用 PROCESSES 名額。
在生產環境中,若無需使用此控制臺,通常建議將其關閉。如需更強大、更穩定的集中監控管理,應部署 Enterprise Manager Cloud Control (EMCC)。
EMCC 安裝文檔可以參考:
- EMCC 13.5 完整安裝詳細版
- Oracle Linux 9 安裝 EMCC 13.5:避坑細節與實戰經驗匯總!
- Oracle EMCC 13.5 集群安裝部署指南
- 實戰篇:Oracle EMCC 24ai 保姆級安裝教程!
解決方案
檢查發現當前主機開啟了 OracleDBConsoleORCL 服務,手動關閉 EM:
## 停止 EM 控制臺服務
emctl stop dbconsole
# Windows服務管理(永久生效)
# 1. 打開services.msc
# 2. 找到"OracleDBConsoleORCL"服務
# 3. 將啟動類型改為"禁用"
# 4. 停止服務(如果正在運行)
# 或者使用命令行
sc config OracleDBConsoleORCL start= disabled
net stop OracleDBConsoleORCL
確保下次啟動默認不啟動 EM,需要在 Windows 服務中關閉 OracleDBConsoleORCL 服務的自動啟動。
關閉后再次檢查會話情況:
SQL> set line2222 pages1000
col username for a10
col program for a30
col machine for a30
select username,program,machine,status,count(1) from v$session where username is not null group by username,program,machine,status;
USERNAME PROGRAM MACHINE STATUS COUNT(1)
-------------------- ------------------------------ ------------------------------ -------- ----------
DBSNMP emagent.exe WORKGROUP\WIN-KTMVJAA4QIM ACTIVE 1
SYS sqlplus.exe WORKGROUP\WIN-KTMVJAA4QIM ACTIVE 1
LIS JDBC Thin Client WIN-KTMVJAA4QIM INACTIVE 10
EMR JDBC Thin Client WIN-KTMVJAA4QIM INACTIVE 30
HIS JDBC Thin Client WIN-KTMVJAA4QIM INACTIVE 30
可見,SYSMAN 用戶的所有 OMS 會話已全部消失,連接池立刻釋放了近1900個進程名額。應用連接隨即恢復正常。
總結
此次連接數爆滿并非業務壓力所致,而是 Oracle Database Control(DBConsole)異常堆積會話 導致,SYSMAN 用戶通過 OMS 程序產生了近 1900 個無效會話,迅速耗盡了 PROCESSES 參數限制,使得正常應用無法建立新連接。
在 Windows 平臺中,DBConsole 服務(OracleDBConsoleORCL)若長期運行且管理不當,容易發生會話泄露。其產生的會話多數處于 INACTIVE 狀態,但依然占用進程資源,這在默認參數設置下極易觸發連接數上限。
預防建議:
- 生產環境慎用 DBConsole:對于正式業務庫,建議關閉 DBConsole,如需集中監控管理,可部署功能更完善的 EMCC(Enterprise Manager Cloud Control)。
- 參數合理規劃:根據業務實際連接需求適當調整 PROCESSES 與 SESSIONS,并保留適量冗余。
因此,數據庫運維不僅要關注核心參數與 SQL 性能,還需將數據庫周邊組件與服務納入監控體系,形成全方位的資源視角,才能防患于未然,保障系統穩定運行。





