最近有网友问到,如何在不知道密码的情况下,重置Oracle过期被锁帐号密码。
之所以要重置,而不是修改;是因为该帐号被很多下游系统所使用,如果修改了密码下游系统也需要进行修改,比较麻烦。
同时,由于年代久远,也没有人知道该帐号的密码。。。。。
那有没有办法在不知道、且不修改密码的情况下重置密码呢?
答案是肯定的,方法如下:
注:如下操作需要使用sysdba进行(因为需要查询user$ 表)
1、首先查询帐号当前的状态
SELECT username,account_status,expiry_date
FROM dba_users
WHERE username = 'TEST_USER';
USERNAME
--------------------------------------------------------------------------------
ACCOUNT_STATUS EXPIRY_DATE
-------------------------------- -------------------
TEST_USER
EXPIRED & LOCKED 2017_11_16:11:23:54
可以看到当前是过期+锁定状态
2、查询被锁帐号的密码密文
11g及以上
sql> select password from user$ where name='TEST_USER';
PASSWORD
--------------------------------------------------------------------------------
E00E2CB7754DD48E
10g
select password from dba_users where username='TEST_USER';
得到密文:E00E2CB7754DD48E
3、重置密码
sql> alter user test_user identified by values 'E00E2CB7754DD48E';
User altered.
4、在次确认帐号状态
sql> SELECT username,expiry_date
2 FROM dba_users
3 WHERE username = 'TEST_USER';
USERNAME
--------------------------------------------------------------------------------
ACCOUNT_STATUS EXPIRY_DATE
-------------------------------- -------------------
TEST_USER
LOCKED 2018_05_15:11:26:57
可以看到,帐号的过期状态已经没有了,现在只剩下锁定状态
5、解锁帐号
sql> alter user test_user account unlock;
User altered.
6、最后确认帐号状态
sql> SELECT username,expiry_date
2 FROM dba_users
3 WHERE username = 'TEST_USER';
USERNAME
--------------------------------------------------------------------------------
ACCOUNT_STATUS EXPIRY_DATE
-------------------------------- -------------------
TEST_USER
OPEN 2018_05_15:11:26:57
大功告成!
为了防止此帐号以后又被过期锁定,可以考虑对此特殊帐号创建一个单独的profile,并取消密码过期策略。
执行如下sql,查看帐号的profile
sql> SELECT username,profile
2 FROM dba_users
3 WHERE username = 'TEST_USER';
USERNAME
--------------------------------------------------------------------------------
PROFILE
--------------------------------------------------------------------------------
TEST_USER
DEFAULT
可以看到是默认的DEFAULT PROFILE
sql> SELECT resource_name,limit FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name in('PASSWORD_LIFE_TIME','Failed_LOGIN_ATTEMPTS');
RESOURCE_NAME
--------------------------------
LIMIT
--------------------------------------------------------------------------------
Failed_LOGIN_ATTEMPTS
10
PASSWORD_LIFE_TIME
180
可以看到,默认的DEFAULT PROFILE的密码过期时间是180天,最大密码错误次数为10次(超过帐号就会被锁定)
可以执行如下命令,将其修改为无限制
ALTER PROFILE DEFAULT LIMIT Failed_LOGIN_ATTEMPTS UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
sql> SELECT resource_name,'Failed_LOGIN_ATTEMPTS');
RESOURCE_NAME
--------------------------------
LIMIT
--------------------------------------------------------------------------------
Failed_LOGIN_ATTEMPTS
UNLIMITED
PASSWORD_LIFE_TIME
UNLIMITED
注间:上面是以默认的DEFAULT PROFILE为例,大家应该根据自己的情况创建不同的PROFILE,有关如何创建PROFILE请自行查阅相关文章。