2009年4月20日星期一

解决ORA-00020错误

项目上使用的Oracle服务器经常出现无法登陆的情况,尝试查看数据库dump文件,没有发现在无法登陆时的报错信息,使用SecureCRT连接服务器登录sqlplus时出现错误"ORA-00020: maximum number of processes (150) exceeded",解决方法如下:

开始时怀疑数据库死锁,通常这种情况下可以通过查询下列表/视图,杀死死锁的进程解决:
V$LOCK列出当前Oracle持有的锁和未解决的锁请求
V$SESSION列出当前连接到数据库的Session信息
DBA_BLOCKERS显示锁住对象的会话
DBA_WAITERS显示等待被锁住对象的会话
DBA_DDL_LOCKS列出所有DDL锁和未解决的DDL锁请求
DBA_DML_LOCKS列出所有DML锁和未解决的DML锁请求
DBA_LOCK列出所有锁和latch,以及所有未解决的锁请求
DBA_LOCK_INTERNAL每个锁或latch显示一行,每个未解决的锁请求显示一行


通过查询V$SESSION视图,发现连接总量已达到上限150,由于在做Oracle ADF开发,该OracleDB作为开发数据库,连接较多属于允许范围内,遂增大最大连接数,修改对应init.ora文件中"procdsses=150",重启DB。

10g里面如此修改无效,可以通过sqlplus连接至数据库
SQL> show parameter processes; //查看processes连接数设置
SQL> show parameter sessions; //查看sessions连接数设置
SQL> alter system set processes=300 scope=spfile; //设置processes连接数
不需要设置sessions连接数,sessions连接数为processes * 1.1 + 5

重启DB,问题解决。

附:用于确定锁住数据库对象的锁的SQL

select c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine   
from v$locked_object a,
v$session b,
dba_objects c   
where b.sid = a.session_id   
and a.object_id = c.object_id;

0 评论:

发表评论