
让我为你详细解释Oracle数据库中的ORA-00020错误。我会先提供官方正式说明,再用通俗易懂的方式讲解,最后给出解决方案。
🗄️ ORA-00020: maximum number of processes exceeded
官方正式说明
错误代码: ORA-00020
错误信息: maximum number of processes (number) exceeded
中文翻译: 超过最大进程数(number)
官方解释:
ORA-00020 是一个资源限制错误。它表示客户端尝试与Oracle数据库实例建立新连接时,数据库实例当前的进程数已经达到了 PROCESSES 初始化参数所设定的上限值,因此新的连接请求被拒绝。
每个连接到数据库的客户端都会对应一个服务器进程(在专用服务器模式下)。PROCESSES 参数定义了数据库实例能够同时支持的最大操作系统进程数量,包括后台进程和服务器进程。此限制是为了防止过多的进程耗尽系统的内存(PGA和SGA)和CPU资源,从而保障数据库的整体稳定性和性能。
通俗易懂的语言讲解
一句话解释: 数据库就像一个只有固定数量工位(Processes) 的办公室,每个数据库连接都需要占用一个工位。现在所有工位都坐满了。当你试图再安排一个人进来(新建一个连接)时,经理拦住了你说:“对不起,办公室工位已满,无法接待更多人”。
举个例子:
假设数据库的 PROCESSES 参数设置为 150。
- 已经有 150 个连接(包括应用程序连接、DBA工具连接和数据库自身后台进程)占用了这些"工位"。
- 此时,第 151 个用户尝试用 SQL*Plus 登录,或者应用程序尝试创建一个新的连接。
- 数据库会立即拒绝这个新请求,并返回 ORA-00020 错误,告诉你:“工位不足,连接不上”。
下图直观展示了ORA-00020错误的发生机制:
flowchart TD
A[新的数据库连接请求] --> B{当前进程数 < PROCESSES 参数限制?}
B -- 是 --> C[创建新进程<br>连接成功]
B -- 否 --> D[抛出ORA-00020错误<br>连接失败]
subgraph E [数据库实例资源池]
F[可用进程槽位]
G[已占用进程槽位<br>(后台进程 + 服务器进程)]
end
B --> E
原因与原理
- 根本原因:活跃的进程数超过了
PROCESSES初始化参数设定的硬性限制。 - 数据库原理:
- 进程 (Process):在专用服务器模式下,每个会话对应一个服务器进程。该进程负责处理用户请求,在PGA(Program Global Area)中分配内存结构来管理连接状态、SQL执行等。
- 资源保护:每个进程都会消耗一定的系统资源(主要是内存和CPU)。如果不加限制,过多的进程可能会耗尽服务器所有资源,导致数据库实例挂起或崩溃。
PROCESSES参数是 Oracle 内置的"资源熔断机制"。 - 参数关系:
SESSIONS参数(最大会话数)通常派生自PROCESSES参数(例如SESSIONS = 1.5 * PROCESSES + 22)。因此,通常先达到PROCESSES限制,然后才会触发SESSIONS限制。
常见发生场景
- 应用程序连接池配置不当:这是最常见的原因。应用服务器的数据库连接池最大大小设置得过高,并且未正确释放连接,导致数据库进程数被耗尽。
- 连接泄漏 (Connection Leak):应用程序代码存在缺陷(例如,未在
finally块中关闭连接),导致进程所占用的资源无法释放。 - 系统负载突增:遭遇业务高峰(如促销活动、批量作业并发执行),正常的连接数超过了数据库当前的容量规划。
- 并行查询配置不当:过度使用或错误配置并行查询(Parallel Query)可能导致产生大量并行从属进程,迅速消耗可用的进程数。
- 参数设置过小:数据库的
PROCESSES参数初始设置过于保守,无法满足业务发展的需要。
相关联的其他 ORA 错误
- ORA-00018: maximum number of sessions exceeded:这是与 ORA-00020 最相关的错误。00018 是会话数超限,而 00020 是进程数超限。通常先达到进程数限制 (ORA-00020),然后才会触发会话数限制 (ORA-00018)。
- ORA-12519: TNS:no appropriate service handler found:监听器无法为新的连接找到可用的服务器进程或分发器,其根本原因往往也是
PROCESSES或SESSIONS达到上限。 - ORA-03135: connection lost contact:如果因为资源耗尽,导致已有的连接也变得不稳定,可能会抛出此错误。
定位原因的方法
当出现 ORA-00020 错误时,可以按照以下流程快速定位问题:
flowchart TD
A[遭遇ORA-00020错误] --> B[尝试以sysdba身份连接]
B --> C{连接成功?}
C -- 否 --> D[停止监听或杀部分进程释放资源]
C -- 是 --> E[检查当前进程/会话数<br>及资源设置]
E --> F[分析会话详细信息<br>(机器、用户、状态、程序)]
F --> G[识别异常来源<br>(连接泄漏、并行查询、特定应用)]
D --> B
G --> H[制定解决方案]
以下是具体的查询命令:
-
确认当前进程数和限制:
-- 查看当前设置的最大进程数和会话数 SELECT name, value FROM v$parameter WHERE name IN ('processes', 'sessions'); -- 查看当前的已使用进程数和会话数 SELECT COUNT(*) FROM v$process; -- 当前进程数 SELECT COUNT(*) FROM v$session; -- 当前会话数 -
分析现有会话和进程:
-- 查看会话的详细信息,按状态排序,重点关注INACTIVE状态的会话 SELECT sid, serial#, username, program, status, machine, logon_time, last_call_et FROM v$session ORDER BY status, last_call_et DESC; -- 查看哪些机器/程序占用了最多连接 SELECT machine, program, COUNT(*) AS connection_count FROM v$session GROUP BY machine, program ORDER BY connection_count DESC;last_call_et字段非常有用,它表示会话自上次操作以来经过的秒数。数值很大的INACTIVE会话很可能是泄漏的连接。program和machine字段可以帮助定位到是哪个应用程序从哪台机器发起的连接。
-
检查并行查询设置(如果怀疑是并行查询导致):
-- 检查是否使用了并行执行 SELECT sid, sql_id, event, degree FROM v$session WHERE event LIKE '%PX%';
解决方案
解决方案分为 紧急恢复(快速恢复业务)和 根本解决(防止问题复发)。
紧急恢复(快速获得连接能力)
| 方法 | 操作命令/步骤 | 风险与注意事项 |
|---|---|---|
| 释放空闲会话 | SELECT sid, serial# FROM v$session WHERE status='INACTIVE' AND last_call_et > 3600; ALTER SYSTEM KILL SESSION '<sid>, <serial#>'; | 谨慎操作,避免杀掉关键作业或事务。优先终止来自测试环境或已知的非关键应用的长时间空闲会话。 |
| 停止监听 | lsnrctl stop (在数据库服务器执行) | 阻止新连接进入,为排查争取时间。不会影响已建立的连接。完成后记得启动:lsnrctl start。 |
| 重启数据库 | SHUTDOWN IMMEDIATE; STARTUP; | 生产环境慎用。这是最后的手段,会中断所有业务。务必评估影响并获得批准。 |
根本解决(优化配置与监控)
-
适当增加 PROCESSES 参数:
-- 需要重启数据库生效 ALTER SYSTEM SET processes=500 SCOPE=spfile; SHUTDOWN IMMEDIATE; STARTUP;注意:增加参数前需评估服务器内存等资源是否充足,避免引发其它性能问题。
-
优化应用程序:
- 修复连接泄漏:检查应用程序代码,确保所有连接都在
finally块或使用 try-with-resources 语句中被正确关闭。 - 优化连接池配置:适当调低应用连接池的最大大小 (
maxActive,maximumPoolSize),并设置合理的空闲超时和验证查询,防止连接闲置不释放。
- 修复连接泄漏:检查应用程序代码,确保所有连接都在
-
优化并行查询配置(如果适用):
-- 限制并行最大服务器数,防止并行进程耗尽资源 ALTER SYSTEM SET parallel_max_servers = 64; -- 设置并行强制本地执行,避免RAC环境下跨节点并行开销 ALTER SYSTEM SET parallel_force_local = TRUE; -
建立监控预警:
- 持续监控
v$session和v$process的使用情况,设置当使用率超过80%时发出告警,以便提前干预。
- 持续监控
希望以上详细的解释和解决方案能帮助你彻底理解并解决ORA-00020错误。如果问题持续存在,可能需要从应用架构层面进行更深入的优化。
欢迎关注我的公众号《IT小Chen》
ORA-00020错误分析与解决方案
670

被折叠的 条评论
为什么被折叠?



