问题描述
最近遇到数据库新创建a用户,登录失败的情况。创建后使用a用户第一次登录报错:”登录失败次数超过限制“的问题。多次登录用户被锁定后,解锁后登录还是相同的错提示。数据库版本:dm8 1-1-156
排查步骤
1、新建实例,创建a用户进行测试
新建实例,并创建a用户测试,测试登录正常。(创建a用户相关语句与原实例相同)
说明数据库软件创建实例,新建用户登录功能均正常
2、在原实例上使用现有其他用户登录和创建其他新用户登录测试
使用现有其他用户登录和创建其他用户并登录测试,测试登录正常。(创建用户、授权等相关语句除了用户名和密码以外其他均和创建a用户相同)
说明现有实例创建用户、用户登录等功能均正常
3、检查数据库当前会话信息以及用户信息
(1)查看数据库当前会话信息
sql语句如下(可以多查询几次):
select user_name,state,clnt_ip,count(*)
from v$sessions
group by user_name,state,clnt_ip
;
从查询结果来看,在192.168.15.70这台机器上有应用程序一直在尝试连接数据库,且通过会话状态观察,并未成功登录到数据库。
(2)查看数据库用户状态信息
select
b.username ,
b.account_status , /*用户状态*/
a.failed_attemps , /*用户自创建之后或者是用户自上一次成功登录以来的失败登录次数,企业版中只要用户成功登录或解锁,该值就会清零*/
a.failed_num , /*用户登录失败次数限制*/
a.lastest_locked /*用户最后一次的锁定时间,与failed_attemps相同,企业版中只要用户成功登录或解锁,该值就会清空*/
from
sysusers a,
dba_users b
where
a.id =b.user_id
and b.username= 'xxx' ;
从上图查询结果可以发现,用户已经被锁,到目前失败登录的次数是190次。
通过多查询几次,然后观察失败登录的次数有没有增加,如果应用程序使用错误的密码不断的连接数据库,failed_attemps列的值会不断变化。
(3)另外,还可以开启sql日志进行查看,会发现sql日志中不断打印除有连接会话“login fail 、alloc session”等信息。
(4)验证
i. 通过将使用的数据库端口修改并重启数据库服务后解锁,使用新的端口可以正常连接
ii. 使用数据库源端口,关闭不断重连数据库的应用服务器上的所有应用,解锁后可以正常登录
解决办法
1、临时解决办法
(1)修改该用户的“登录失败次数”资源限制为unlimited,然后解锁该用户。相关语句如下:
/*企业版使用sysdba用户登录进行操作*/
/*修改用户“登录失败次数”资源限制为unlimited*/
alter user 用户名 limit failed_login_attemps unlimited;
/*解锁用户*/
alter user 用户名 account unlock;
---或者
call sp_unlock_user('用户名');
如果修改上面资源限制,然后解锁用户后还是无法登录,建议重启数据库服务,检查用户状态如果是锁定状态需要执行解锁。
但是需要注意的是,应用不断重连数据库,虽然没有成功创建会话,但是在重连期间也会占用数据库的会话数。如果过多可能会达到max_sessions设置的会话数上线,这时新的正常的会话连接请求会失败,日志也会有报错信息:“reached the max session limit.”
(2)创建并使用其他新的用户名或者更换现有应用使用的数据库端口。
2、永久解决办法
根据上面排查步骤3中的sql语句查询找到对应的应用服务器,然后检查应用服务器上相关应用程序数据源配置以及应用日志文件,更改正确的用户密码。
总结
该报错主要原因是由于使用错误的用户密码登录导致达到设置失败登录次数限制,常见的场景是有应用程序使用了该用户在不断尝试连接数据库且使用了错误的密码,导致用户创建之后直接报错。
正常的排查步骤只需要进行步骤3的检查即可,前两步测试验证主要是针对本次遇到的情况。本次遇到修改了资源限制为unlimited然后解锁用户,但是还是无法登录的情况,而且根据当时应用厂商的反馈是没有应用使用该用户连接数据库,所以才有了前两步的测试验证,排除数据库软件实例本身的问题。经过最后第3步排查并验证,应用厂商检查那台应用服务器上有应用程序中配置多个数据库用户连接数据库,其中包括了新创建的用户,将数据源配置文件中关于该用户的配置注释掉重启应用后正常。