ORA-00020: maximum number of processes (1000) exceeded 故障一列

本文记录了一次ORA-00020错误的排查过程,该错误源于数据库进程数达到上限。通过分析alert日志及trace文件,最终定位到归档日志满为根本原因,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[root@ijxdg ~]# su - oracle
[oracle@ijxdg ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 18 18:14:15 2014

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-00020: maximum number of processes (1000) exceeded

--alert日志:
Thu Sep 18 18:13:59 2014
Process J002 submission failed with error = 20
kkjcre1p: unable to spawn jobq slave process
Errors in file /u01/app/oracle/diag/rdbms/orcldg/orcl/trace/orcl_cjq0_11338.trc:
Thu Sep 18 18:14:26 2014
ORA-00020: maximum number of processes 1000 exceeded
ORA-20 errors will not be written to the alert log for
the next minute. Please look at trace files to see all
the ORA-20 errors.
Thu Sep 18 18:15:17 2014
Process m000 submission failed with error = 20
Thu Sep 18 18:15:27 2014
ORA-00020: maximum number of processes 1000 exceeded
ORA-20 errors will not be written to the alert log for
the next minute. Please look at trace files to see all
the ORA-20 errors.
......

Thu Sep 18 18:20:03 2014
Process W000 submission failed with error = 20
Process W000 submission failed with error = 20
Process W000 submission failed with error = 20
Process W000 submission failed with error = 20

--查看listener.log 发现如下错误
18-SEP-2014 18:10:08 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=JYSD))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.217)(PORT=54584)) * establish * orcl * 0
18-SEP-2014 18:10:08 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=JYSD))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.217)(PORT=54586)) * establish * orcl * 12518
TNS-12518: TNS:listener could not hand off client connection
TNS-12547: TNS:lost contact
  TNS-12560: TNS:protocol adapter error
   TNS-00517: Lost contact
    Linux Error: 32: Broken pipe
    
     
--此时已经登录不进库
ps -ef|grep LOCAL               --可以看到很多连接

使用os命令kill掉一些进程以释放资源      --head 取前10条
ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|head|xargs kill -9
     
登陆后台数据库进一步观察会话使用情况
select event,program,count(*) from v$session group by event,program order by 3;

EVENT                                    PROGRAM                          COUNT(*)
---------------------------------------- ------------------------------ ----------
DIAG idle wait                            oracle@lf1  (DIAG)                       1
class slave wait                          oracle@lf1  (GCR0)                       1
buffer busy waits                         oracle@lf1  (J004)                       1
library cache lock                 OMS                              59

从结果输出发现大量的会话处于library cache lock等待事件中,接下来 定位阻塞者是哪个会话
select event,p1raw,p2 from v$session where event ='library cache lock';
EVENT                P1RAW                    P2
-------------------- ---------------- ----------
library cache lock   000000007C384160 1737585656
library cache lock   000000007C384160 1737462296
library cache lock   000000007C384160 1737338936
library cache lock   000000007C384160 1737215576
library cache lock   000000007C384160 1737092216
library cache lock   000000007C384160 1736968856
。。。。

select event from v$session where saddr=( select kgllkses from x$kgllk where KGLLKhdl ='000000007C384160' and KGLLKMOD>0 );
EVENT
----------------------------------------------------------------
log file switch (archiving needed)
   
至此已经看到了导致ORA-00020错误的源头,归档满了,删除多余日志问题解决!
<think>好的,我现在需要帮用户解决Oracle数据库执行ALTER DATABASE MOUNT时出现ORA-00059错误的问题。首先,我得确认用户提到的错误信息。ORA-00059表示超过了DB_FILES的最大限制,这通常发生在数据库参数设置不足以处理当前的数据文件数量时。 首先,我应该回忆一下DB_FILES参数的作用。DB_FILES参数定义了数据库可以同时打开的数据文件的最大数量。当用户尝试挂载数据库时,如果现有的数据文件数量超过这个参数设置的值,就会触发ORA-00059错误。这个时候,用户可能需要调整这个参数的值,但需要知道如何正确修改。 接下来,我需要考虑如何修改DB_FILES参数。通常,这个参数是在初始化参数文件(如init.ora或spfile)中设置的。用户需要先关闭数据库实例,然后修改参数,再重新启动实例。不过,修改静态参数可能需要使用CREATE PFILE FROM SPFILE来生成pfile,再编辑pfile中的DB_FILES值,之后用这个pfile创建新的spfile,或者直接启动时指定pfile。这一步需要确保步骤正确,否则可能导致数据库无法启动。 另外,修改DB_FILES之后,需要重新挂载数据库,但用户之前的问题是在挂载时出现的错误。所以需要确认在修改参数后,重新启动实例到nomount状态,然后执行ALTER DATABASE MOUNT。这时,新的DB_FILES值应该生效,允许更多的数据文件被处理。 此外,可能还需要检查当前数据库中的数据文件数量是否确实超过了原来的DB_FILES设置。用户可以通过查询DBA_DATA_FILES视图来确认现有数据文件的数量。如果数量接近或超过原设置,增加DB_FILES是必要的。 还要注意,DB_FILES是一个静态参数,修改后必须重启数据库才能生效。因此,用户需要计划好维护窗口,避免影响业务运行。另外,虽然增加DB_FILES可以解决当前的问题,但设置过高的值可能会占用更多的系统资源,需要平衡实际需求和系统性能。 用户可能还关心如何避免未来再次出现类似问题。这时候可能需要定期监控数据文件的数量,并确保DB_FILES参数留有足够的余量。或者,考虑使用Oracle的自动扩展功能,但DB_FILES本身是硬性限制,自动扩展可能不适用,所以主要还是参数调整。 最后,我应该总结解决步骤,并提醒用户备份参数文件,以免修改出错导致无法启动数据库。同时,可能还需要检查其他相关参数,比如MAXDATAFILES,但MAXDATAFILES是在创建数据库时设置的,不能动态修改,所以可能需要重建数据库,但这应该是最后的选择。不过,ORA-00059通常通过调整DB_FILES即可解决,所以重点放在修改这个参数上。 在生成相关问题的时候,需要考虑用户可能进一步的问题,比如如何永久修改参数,如何处理静态参数,如何监控数据文件数量,以及错误处理的最佳实践。这样用户可以有更全面的解决方案和预防措施。</think>### ORA-00059错误解决方案 当执行`ALTER DATABASE MOUNT`时出现ORA-00059错误(`maximum number of DB_FILES exceeded`),表示当前数据库的`DB_FILES`参数设置无法满足实际数据文件数量需求。以下是逐步解决方案: --- #### 1. **确认当前DB_FILES参数值** 首先查看当前数据库的`DB_FILES`参数设置: ```sql SHOW PARAMETER DB_FILES; ``` 如果输出结果为`DB_FILES=200`,则表示当前最多允许200个数据文件[^1]。 --- #### 2. **查询实际数据文件数量** 验证当前数据库实际使用的数据文件数量: ```sql SELECT COUNT(*) FROM DBA_DATA_FILES; ``` 如果查询结果接近或超过`DB_FILES`参数值,则需调整参数[^2]。 --- #### 3. **修改DB_FILES参数** ##### 3.1 关闭数据库实例 ```sql SHUTDOWN IMMEDIATE; ``` ##### 3.2 修改初始化参数 - **使用SPFILE的情况**: ```sql CREATE PFILE='/tmp/init_temp.ora' FROM SPFILE; ``` 编辑生成的`/tmp/init_temp.ora`文件,修改: ```ini DB_FILES=新值(如500) ``` 重新生成SPFILE: ```sql CREATE SPFILE FROM PFILE='/tmp/init_temp.ora'; ``` - **直接使用PFILE的情况**: 直接编辑`init.ora`文件并修改`DB_FILES`参数。 --- #### 4. **重启数据库实例** ```sql STARTUP NOMOUNT; ALTER DATABASE MOUNT; ALTER DATABASE OPEN; ``` 此时新参数值生效。 --- #### 5. **验证修改结果** 重新检查参数值: ```sql SHOW PARAMETER DB_FILES; ``` 确保新值已生效,且数据文件数量未超过限制。 --- ### 关键注意事项 1. **参数类型**:`DB_FILES`是静态参数,修改后需重启实例生效。 2. **系统资源**:设置过高可能导致内存占用增加,需根据实际需求平衡。 3. **数据文件上限**:`DB_FILES`最大值为65535(取决于Oracle版本和操作系统)。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值