项目上使用的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;