记一次锁表导致的会话连接爆满定位,与v$session视图

服务因连接不上数据库导致访问异常,排查发现数据库会话连接数超出限制。通过重启服务和增大连接池无法解决问题。最终发现一个长时间执行的UPDATE SQL疑似锁表,锁定相关表后,服务停止时未释放会话连接。解锁表后,连接立即消失,揭示了锁表是导致连接爆满的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天上班,突然收到通知说某个服务访问不正常,于是赶紧看了下该服务的cataline.out日志,发现是得不到另一个服务的返回值,于是查看对应的服务的日志,发现取不到连接资源,从而连接不上数据库。(一波三折,定位问题就是这么麻烦)

    初步定位认为是该服务设置的连接池太小了,于是为了尽快恢复服务,就将服务重启以释放连接。一开始好了,可是没过几分钟服务又挂了,于是加大连接池的连接数,50加到100,过一会服务又挂了,拉人定位,然后加大连接池继续重启,100到200。过一会又挂了,这会不行了,不能再加大连接池了,这不理想也不能无限制加,于是让服务瘫着抓紧定位问题。

select count(*) from v$session where machine='主机名' and username='用户名';

    查看从该服务器连接到数据库实例的连接数量,发现每台机器的连接数量都有700到800个连接,而服务的会话连接池最大也就200,两套服务重启了几次,总数量加起来大概也就这个值,说明服务重启并没有将之前的会话删掉,这个问题就很大了。很快会话连接数已经达到了数据库设置的会话连接上限,导致后续的连接数据库操作出现TNS报错,无法连接数据库。

    这时有三种方法恢复数据库:

1、杀掉该数据库用户下的所以会话连接:

select 'alter system kill session '||sid','serial#||' immediate;' from v$session where username='用户名';
    杀了连接又有新连接补上,基本删除不完。

2、杀掉数据库上该实例下的所以远程连接进程:

kill -9 `ps -ef | grep "oracle实例名 (LOCAL=NO)" | awk -F "{print $2}"`<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值