系统的session数过大,导致数据库进程数满,无法连接的问题。
oracle用户登录服务器,使用dba身份进入sqlplus:
命令:sqlplus / as sysdba
报错:ERROR: ORA-00020: maximum number of processes (1000) exceeded(线程数超过最大值1000了)
管理员也无法登陆数据库 只有关闭oracle 的监听:
命令:lsnrctl stop
关闭了监听,就不会有新的用户登录进来,也不会生成新的会话,占用进程了。
这个时候可以使用管理员登录了(sqlplus / as sysdba)
2、登陆数据库之后,查看会话session的使用情况
命令:select count(1) from v$session;
3、查看session数最多的机器
命令:select machine,count(1)coun from v$session group by machine order by 2 desc
;
4、下面命令可以查询到:占用session最多的机器、用户、程序的线程号(同系统进程号)这样,就找到占用session多的机器、用户、程序。
命令:
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.machine = *****;
5、结束相关占用比较多的进程(spid 进程号)
命令:kill -9 spid
6、为了方便可以通过sql 语句获取spid号,打印出kill 命令,直接copy ,粘贴到服务器上执行
select 'kill -9 '||spid
from v$session s,v$process p
where s.paddr=p.addr and s.machine = ****;
7、可以打印出kill 命令,直接copy 一列,,粘贴到服务器上执行,就搞定了。
session : 指用户连接的session
process : 指session执行的线程
session 可以从 v$session 表查看,process 可以从v$process 表查看,
session和process 表的关系为:session表中保存了process的地址。
select s.sid,p.PID,s.*,p.* from v$session s,v$process p where s.paddr=p.addr
select * from v$parameter where name like 'sessions' or name like 'processes'
在v$parameter 表可以查看session和process的配置,建议配置session 略大于process,可以修改(但重启后生效):
相关修改的命令:alter system set processes=500 scope=spfile;
alter system set sessions=555 scope=spfile;
或者:show parameter processes;
show parameter sessions;