大家好,我只谈技术,不剪头发。 Tony 老师。
定期修改数据库用户密码可能会导致应用程序中断。通常,我们需要计划停机时间,修改数据库用户密码,修改应用服务器中的连接信息,最后重新启动应用程序。
不过,从 Oracle 21c 一开始,我们可以定义密码切换的过渡时间,旧密码和新密码可以同时连接到数据库。这意味着我们可以修改数据库密码,但应用程序不需要断开和重建连接。不仅如此 Oracle 21c 可用,也向前移植 Oracle 19c(19.12 补丁更新)。
创建测试用户
首先,使用特权用户连接数据库并创建测试用户:
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba --drop user testuser1 cascade; create user testuser1 identified by testuser1 quota unlimited on users; grant connect, resource to testuser1;
创建密码,逐步切换配置
创建信息配置项,将 PASSWORD_ROLLOVER_TIME 设置为 1 然后将其与测试用户联系起来:
-- drop profile pw_rollover_time_prof; create profile pw_rollover_time_prof limit password_rollover_time 1; alter user testuser1 profile pw_rollover_time_prof;
我们也可以使用它 ALTER PROFILE 修改现有配置项中的命令修改 PASSWORD_ROLLOVER_TIME 限制。以下示例将过渡时间修改为 1.5 天:
alter profile pw_rollover_time_prof limit password_rollover_time 1.5;
PASSWORD_ROLLOVER_TIME 允许的最小值为 最大值为1小时(1、24) 60 天。
测试连接
我们使用测试用户连接数据库并重置密码:
conn testuser1/testuser1@//localhost:1521/pdb1 alter user testuser1 identified by newpasswd1;
在接下来的 1.5 我们可以同时使用旧密码和新密码连接数据库。
conn testuser1/testuser1@//localhost:1521/pdb1 Connected. SQL> conn testuser1/newpasswd1@//localhost:1521/pdb1 Connected. SQL>
相关视图
DBA_USERS 视图中添加了一个 PASSWORD_CHANGE_DATE 标识用户是否处于密码切换的过渡状态 ACCOUNT_STATUS 字段。以下查询已返回帐户 TESTUSER1 的状态:
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba select account_status, to_char(password_change_date, 'dd-mon-yyyy hh24:mi:ss') as password_change_date from dba_users where username = 'TESTUSER1'; ACCOUNT_STATUS PASSWORD_CHANGE_DATE -------------------------------- ----------------------------- OPEN & IN ROLLOVER 21-nov-2021 19:22:43 SQL>
PASSWORD_ROLLOVER_TIME 的值可用通过 DBA_PROFILES 视图查看:
column resource_name format a25
column limit format a10
select resource_name,
limit
from dba_profiles
where profile = 'PW_ROLLOVER_TIME_PROF'
and resource_name = 'PASSWORD_ROLLOVER_TIME';
RESOURCE_NAME LIMIT
------------------------- ----------
PASSWORD_ROLLOVER_TIME 1.5
SQL>
禁用密码逐步切换功能
如果将 PASSWORD_ROLLOVER_TIME 设置为 0,可用禁用密码逐步切换功能。在以下示例中,我们将该值设置为 0,然后就无法使用旧密码登录数据库:
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba
alter profile pw_rollover_time_prof limit
password_rollover_time 0;
conn testuser1/testuser1@//localhost:1521/pdb1
USER = testuser1
URL = jdbc:oracle:oci8:@//localhost:1521/pdb1
Error Message = no ocijdbc21 in java.library.path
USER = testuser1
URL = jdbc:oracle:thin:@//localhost:1521/pdb1
Error Message = ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL>
注意事项
如果我们需要在紧急情况下禁用密码逐步切换功能并重新设置该功能,必须确保在这两个操作之间执行一次登录操作,否则结果可能不是我们预期的行为。
我们首先重置过渡时间并再次修改密码。
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba
alter profile pw_rollover_time_prof limit
password_rollover_time 1.5;
conn testuser1/newpasswd1@//localhost:1521/pdb1
alter user testuser1 identified by newpasswd2;
此时,我们可以使用任意一个新密码登录。
conn testuser1/newpasswd1@//localhost:1521/pdb1
Connected.
SQL>
conn testuser1/newpasswd2@//localhost:1521/pdb1
Connected.
SQL>
将 PASSWORD_ROLLOVER_TIME 设置为 0 后立即将它改回 1.5 天,期间没有新的连接。
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba
alter profile pw_rollover_time_prof limit
password_rollover_time 0;
alter profile pw_rollover_time_prof limit
password_rollover_time 1.5;
由于这两个修改操作之间没有新的连接,我们仍然可以使用任何一个密码登录。
conn testuser1/newpasswd1@//localhost:1521/pdb1
Connected.
SQL>
conn testuser1/newpasswd2@//localhost:1521/pdb1
Connected.
SQL>
如果觉得文章有用,欢迎关注❤️、评论📝、点赞👍!