1 问题描述
接到网站运维人员报告说原来的账户不能登录到Oracle数据库了,提示密码过期。
2 原因分析
本次出问题的Oracle版本是11g,11g之前的Oracle版本的默认profile是没有密码过期限制的,而在Oracle 11g中,默认情况下profile启用的密码过期时间是180天。显然登录账号的密码已经超过180天没有修改了,所以出现了上述问题。
3 解决办法
有三种解决办法:
(1)使用sqlplus登录出问题账户,会提示设置新密码,此时重新输入密码即可,新密码可以和原来的密码相同。
(2)使用sqlplus登录管理员账户,执行 alter user 账户名 identified by 新密码,新密码可以和原来的密码相同。
(3)使用sqlplus登录管理员账户,执行 alter profile default limit password_life_time unlimited; 这会让密码没有过期限制。
4 相关知识
与密码相关的表为dba_profiles。
使用sqlplus登录管理员账户,执行 select * from dba_profiles where profile='DEFAULT' and RESOURCE_NAME like 'PASSWORD%'; 会出下如下:
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- -----------
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
DEFAULT PASSWORD_LOCK_TIME PASSWORD 1
DEFAULT PASSWORD_GRACE_TIME PASSWORD 7
下面解释其含义:
(1)FAILED_LOGIN_ATTEMPTS 规定了登录可以失败的次数,一旦用户尝试登录错误的次数超过这个值,账户就会被锁定,只能由管理员解锁。
(2)PASSWORD_LIFE_TIME 规定了密码过期的时间长度,11g默认是180天,本文提到的问题就是在这里。
(3)PASSWORD_REUSE_TIME 规定了重新使用原来的密码时必须经过的时间,默认没有限制。
(4)PASSWORD_REUSE_MAX 规定了重新使用原来密码的次数,也就是同一个口令可以被重复设置多少次,本例没有限制,所以可以重复设置相同密码。
(5)PASSWORD_VERIFY_FUNCTION 用户自定义的密码验证规则函数,是一个PL/SQL脚本,一般不需要修改。
(6)PASSWORD_LOCK_TIME 登录失败后被锁定的用户,锁定的天数,本例中是1天。
(7)PASSWORD_GRACE_TIME 指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。本例中,会在密码到期前7天开始发出警告。