注册
记一次会话超限,登陆不了数据库的处理过程

记一次会话超限,登陆不了数据库的处理过程

csw 2022/09/01 2545 4 1
摘要 会话超限,用户密码错误导致

1.问题描述

近日,收到某项目反馈,数据库会话告警,达到最大会话限制,数据库登陆不了。

2.问题分析

2.1查询数据库会话情况

select count(*) from v$sessions;
select count(*),state,clnt_ip from v$sessions group by state,clnt_ip;

通过上面的sql,可以查询出数据库当前的会话连接数,以及哪个ip的会话连接数最多。当时通过登陆SYSDBA用户查询到的数据库会话数已经是1501了,而数据库设置的最大连接数MAX_SESSIONS是1500,所以触发了告警。
注:SYSDBA用户不受MAX_SESSIONS会话连接数限制,所以当时我们可以登陆查询。

2.2查询用户的连接数

通过执行下面的sql进一步分析哪个用户占用的连接数最多:

select user_name,clnt_ip,count(*) from v$sessions group by user_name,clnt_ip;

image.png

可以看到第6行,有个NULL用户占用连接数达到1242个,找到问题点了。

2.3分析NULL用户会话

进一步分析NULL用户执行的是什么具体SQL语句:
image.png
发现都是些NULL会话,没有具体的SQL语句。

2.4检查数据库用户状态

select a.username,b.password,b.last_login_ip,b.failed_attemps,a.account_status,b.conn_idle_time  from dba_users a,SYSUSERS b where a.user_id=b.id;

image.png
发现有个用户尝试登陆失败次数达到了29w多次,一直在尝试登陆,失败后被锁定,自动解锁后,又继续尝试,锁定…如此反复下去。此时,怀疑是这个原因导致的NULL会话数超高。

3.问题处理

3.1关闭null会话

通过以下脚本批量关闭NULL会话:

begin
 for rs in (select sess_id from v$sessions where state='STARTUP' and user_name is null) loop
 execute IMMEDIATE  'sp_close_session('||rs.sess_id||');';
end loop;
end;

但是,关闭后,活动会话又陆续涨起来。

3.2修改用户密码

通过ip地址,定位到某个配置文件,把这个不断尝试登陆的用户密码改正确后。NULL会话不会上涨,问题解决。

4.总结

本次会话超限的问题是用户密码不正确,导致应用不断尝试连接导致的。建议对用户的尝试次数也进行监控,比如尝试登陆失败次数超5次后,就触发告警,让管理员及时处理。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服