暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库连接数满问题处理

原创 鸿惊九天 2022-12-06
7612

最近在使用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 vprocessa,vprocess a, 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 vsessiona,vsession a, 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;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论