近期有一个生产数据库用户总是被锁,导致生产环境有些应用的访问数据库连接失败,造成生产事故,针对用户被锁的问题进行如下记录说明。
首先将被锁用户解锁,然后排查具体原因。
解锁方式:
1.使用dba角色用户登录,查看用户是否被锁。
select username,lock_date from dba_users;
2.查看用户如果lock_date有值则说明该用户被锁,需要进行解锁。
alter user username account unlock;
排查问题的流程如下:
用户被锁原因:
1.频繁登陆oracle该用户密码错误,并超过一定的数目。
1)一般默认的用户密码错误数量为10。可以通过dba角色进行查看。
其中FAILED_LOGIN_ATTEMPTS的值为错误数量。默认为10。
select * from dba_profiles;
2)进行修改为30次
alter profile default limit FAILED_LOGIN_ATTEMPTS 30;
3)修改为无限次(不推荐,会造成数据库资源安全问题)
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;
注:通过修改密码错误的允许次数这种方式只能治标不治本。真正还是需要查看是什么应用将该账户锁定。
故障排查:
如我此次出的问题为维护方将TongWeb中间件的服务停掉,但是未正确停掉该服务的java线程,由于维护方认为线程已经停止,因此在修改oracle用户的密码后,没有按照规定将该服务原有数据源密码修改,认为没有影响,但是恰恰该服务的一个线程还是启动并在尝试链接该用户,因此导致频繁密码错误将用户锁定。
可以通过查看数据库所在安装目录的监听日志进行时间点定位到应用(由于我们无法远程到生产方的数据库,无法查看他们的监听日志,因此如下是样例,不是真正的生产情况)
查看$ORACLE_HOME/network/admin/log/listener.log日志
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0
这样可知是上面10.69.1.11的ip尝试多次失败登陆造成的被锁
由于我这边没有如此便利条件,因此我是将所有可能链接该数据库的服务器上的进程逐条查看并查看每个应用的数据库配置才找到原因。
2.第二个原因是该用户过期,默认的用户过期时间为180天,如果用户时间超过180天,则也会锁定用户。
使用dba角色用户登录,处理该问题。
1)查看该用户的profile,一般为default
select username,profile from dba_users;
2)查看指定概要文件找到用户的权限所代表的时间,如default
select * from dba_profiles where profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
3)修改该字段为unlimited,将默认180天修改成‘无限制’
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
修改结束后不需要重启数据库直接生效。
4)之后需要将密码激活,使用dba角色登陆
alter user username identified by <原来的密码>。