最近在使用Oracle的过程中,出现了数据库连接数满的情况,导致程序及数据库连接工具连接不上。主要从两个方面来考虑这件事,从程序方面来看:
1.进行数据库连接操作后未释放连接;
2.若使用了数据库连接池,则考虑连接池的超时设置。
3.检查应用的连接数,是不是配置的小了。
从数据库本身来看:
1.检查数据库的最大连接数和当前连接数,是否是公用的数据库,被别人占用了;可以增加数据库的最大连接数。
2.可以定时清理数据库中INACTIVE的会话。
3.如果上面均正常,那么查询时间最长的sql,是否是有锁死等待的sql,一直在创建,但是一直锁等待。
---- 当前连接数
select count() from vprocess ;
--- 最大连接数
select value from vparameter where name =‘processes’;
查看Oracle连接数:
select b.MACHINE, b.PROGRAM , count() from vsession b where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE , b.PROGRAM order by count(*) desc;
— 当前所有用户,按照连接数排序
select username,count(username) as con from v$session where username is not null group by username order by con desc;
---- 按执行时间排序
SELECT osuser, a.username,cpu_time/executions/1000000||‘s’, sql_fulltext,machine
from vsqlarea b
where a.sql_address =b.address order by cpu_time/executions desc;
今天又遇到了11gR2连接数满的问题,以前也遇到过,因为应用那边没有深入检查,没有找到具体原因,暂且认为是这个版本Oracle的BUG吧。
上次的处理办法是用Shell脚本定时在系统中kill v$session.status='INACTIVE’的连接,但是这次现场没有在操作系统中部署脚本的权限,只好在数据库中做处理,幸好我们对这个数据库有完全的权限。这次使用了profile+JOB定时alter system kill ‘sid,seral#’ immediate的方式。具体脚本如下:
CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 30;
–如果30分钟过期时间太短,对数据库访问性能产生了影响,可以调整
ALTER PROFILE KILLIDLE LIMIT IDLE_TIME 60;
SELECT * FROM dba_profiles WHERE PROFILE=‘KILLIDLE’;
ALTER USER TEST_USER PROFILE KILLIDLE;
SELECT username,PROFILE FROM dba_users WHERE username=‘TEST_USER’;
ALTER SYSTEM SET resource_limit=TRUE;