Oracle 19c RAC生产库,业务应用连接数很低,但数据库进程持续上涨,最终触发ORA-00020: maximum number of processes exceeded,新业务连接无法创建,存量会话不受影响。
排查发现大量oracle@主机名(P00X)并行从属进程堆积;根因为备份启用Oracle并行执行,直接写入hard挂载NFS存储。NFS链路异常造成IO内核阻塞,PQ并行子进程hang住无法释放,多次执行备份后进程不断累积,耗尽processes资源。

一、故障现象
-
报错
ORA-00020,存量业务会话正常,仅新建连接失败;业务侧在线连接数量很低,不存在业务连接泄漏。 -
执行
v$process按program分组统计,oracle@YYPTDG进程高达3679个,数据库总进程达到processe上限。 -
备份任务卡住无进度,在备份平台手动取消任务,数据库端P开头并行进程不会自动退出;重复执行备份,PQ进程持续累加。
sql
select program,count(*) from v$process group by program order by 2 desc;
二、根因分析
1. Pxxx进程为PQ并行从属进程
备份产品调用Oracle并行执行框架,并行读取库内数据、写入NFS备份卷。并行开启后,Oracle会生成大量PQ Slave子进程承担IO读写。普通RMAN channel遇到IO错误会正常退出;但PQ从属进程一旦IO在内核阻塞,无法收到上层异常信号,会话永久hang。
2. Hard挂载NFS是核心诱因
NFS使用默认hard挂载。当NFS网络/存储服务异常,内核会无限重试IO请求,不向上层返回IO失败,进程进入Linux D不可中断睡眠状态。
即使上层备份任务取消,IO阻塞在内核,进程无法执行退出逻辑,造成进程泄漏。
3. process是全局资源
processes参数限制数据库操作系统进程总数,业务连接、后台进程、PQ并行进程、备份会话全部占用该配额。本次故障资源消耗主体不是业务,而是堆积的挂死PQ进程,多次备份叠加后直接打满。
三、快速排查命令
数据库SQL
sql
-- 查看挂死PQ进程等待事件
select p.spid,s.sid,s.event,s.wait_class,s.state
from v$process p
join v$session s on p.addr = s.paddr
where s.program like '%(P00%)';
-- 确认备份相关SQL
select sid,sql_id,sql_text from v$sql where sql_id in
(select sql_id from v$session where program like '%(P00%)');
操作系统命令
bash
# 检查NFS挂载参数
mount |grep nfs
# 查看D状态(内核阻塞)oracle进程
ps aux | awk '$8 ~ /D/'
# 筛选PQ并行进程
ps -ef | grep oracle | grep P00
四、应急处置步骤
-
停止所有备份任务,阻止新增PQ并行进程。
-
排查NFS存储/网络,优先恢复NFS链路。
-
NFS恢复后等待,部分进程自动退出;剩余hang死PQ进程,通过spid在OS层有序kill。
-
NFS完全不可用场景,执行
umount -l懒卸载NFS挂载点,释放内核阻塞IO。 -
监控
v$process,进程回落,验证新建数据库连接,业务恢复。
五、整改优化方案
1. NFS挂载参数优化
增加IO超时,避免永久阻塞,推荐参数:
bash
hard,rsize=1048576,wsize=1048576,timeo=600,retrans=2
timeo=600代表60秒超时,超时内核返回IO失败,进程正常退出;不推荐直接soft挂载,存在丢数据风险。
2. 限制备份并行度
控制备份任务的Oracle并行度,预估并行从属进程数量,process预留20%~30%资源冗余。
3. 增加任务超时兜底
备份产品增加作业超时自动终止;数据库配置profile会话超时,防止会话永久hang。
4. 新增专项监控告警
-
全局监控
v$process总量,75%阈值告警 -
专项监控
P00%并行从属进程数量,突增触发告警 -
监控NFS挂载状态、NFS IO延迟,提前发现存储异常
5. 中长期架构优化
数据库备份先写入本地磁盘,备份集生成完成后,再cp至NFS。隔离NFS故障,避免Oracle进程直接写NFS。
六、经验总结
-
看到
ORA-00020不要直接判定业务连接爆满,优先按program分组统计v$process,定位进程来源。PQ并行进程、备份进程同样占用process名额,极易被忽略。 -
Oracle进程直接读写hard模式NFS存在风险:存储链路中断会造成D状态进程,上层任务取消无法释放内核阻塞进程,形成进程泄漏。
-
并行执行提升备份性能,但并行从属进程的异常容错逻辑和普通RMAN通道不一样,备份产品设计必须考虑存储故障场景。
-
监控不仅要关注业务指标,备份衍生的数据库资源消耗也需要单独监控,做到前置预警。