在 Oracle 19c 多租户架构中,业务用户通常创建在具体的 PDB 里,而不是 CDB$ROOT 中。因此,查看用户状态、修改密码策略前,必须先进入对应 PDB。否则可能出现"查不到用户"或"改了但没生效"的情况。
一、进入数据库并切换到对应 PDB
先切换到 Oracle 用户,并确认当前实例:
su - oracle
echo $ORACLE_SID
如果需要切换实例,例如本次环境使用 UTF8CDB1:
export ORACLE_SID=UTF8CDB1
sqlplus / as sysdba
进入 SQL*Plus 后,查看当前 CDB 下有哪些 PDB:
show pdbs;
示例结果:
CON_ID CON_NAME OPEN MODE
------ --------- ----------
3 IETQMS READ WRITE
5 QMS READ WRITE
切换到对应 PDB,例如进入 QMS:
alter session set container=QMS;
确认当前所在容器:
show con_name;
如果显示:
CON_NAME
------------------------------
QMS
说明已经进入 QMS PDB。后续查询用户、修改 Profile,都只针对当前 PDB 生效。
二、查看用户是否锁定或密码是否过期
set lines 200 pages 200
col username for a30
col account_status for a30
col profile for a20
col expiry_date for a20
select
username,
account_status,
profile,
to_char(expiry_date,'yyyy-mm-dd hh24:mi:ss') expiry_date
from dba_users
where oracle_maintained = 'N'
order by username;
重点看两列:
| 字段 | 含义 |
|---|---|
ACCOUNT_STATUS |
用户状态,OPEN 表示正常 |
EXPIRY_DATE |
密码过期时间,空值表示当前不会过期 |
如果用户状态是 OPEN,并且 EXPIRY_DATE 为空,说明用户当前正常,密码不会因生命周期到期而过期。实际检查中,QMSADMIN、QMS_ADMIN 等用户状态为 OPEN,且 EXPIRY_DATE 为空,说明密码永不过期已生效。
三、查看 Profile 密码策略
Oracle 用户密码过期和锁定策略由 Profile 控制。常见业务用户一般使用 DEFAULT Profile。
set lines 200
col profile for a20
col resource_name for a35
col limit for a30
select profile, resource_name, limit
from dba_profiles
where profile = 'DEFAULT'
and resource_name in (
'FAILED_LOGIN_ATTEMPTS',
'PASSWORD_LOCK_TIME',
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME'
)
order by resource_name;
常见推荐结果:
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_GRACE_TIME 7
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_LOCK_TIME 1
含义如下:
| 参数 | 含义 |
|---|---|
FAILED_LOGIN_ATTEMPTS = 10 |
连续输错密码 10 次后锁定 |
PASSWORD_LOCK_TIME = 1 |
锁定 1 天后自动解锁 |
PASSWORD_LIFE_TIME = UNLIMITED |
密码永不过期 |
PASSWORD_GRACE_TIME = 7 |
密码过期宽限期,密码永不过期时基本不触发 |
四、设置密码永不过期
进入对应 PDB 后执行:
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;
如果想一次性整理成推荐策略,可以执行:
alter profile DEFAULT limit
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME 7;
这套配置的效果是:
密码永不过期;
连续输错 10 次会锁定;
锁定 1 天后自动解锁。
五、验证是否生效
查看 Profile:
select profile, resource_name, limit
from dba_profiles
where profile = 'DEFAULT'
and resource_name in (
'FAILED_LOGIN_ATTEMPTS',
'PASSWORD_LOCK_TIME',
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME'
)
order by resource_name;
确认看到:
PASSWORD_LIFE_TIME UNLIMITED
再查看用户:
select
username,
account_status,
profile,
to_char(expiry_date,'yyyy-mm-dd hh24:mi:ss') expiry_date
from dba_users
where oracle_maintained = 'N'
order by username;
如果业务用户 ACCOUNT_STATUS = OPEN,且 EXPIRY_DATE 为空,就说明密码永不过期已经生效。
六、注意事项
alter profile DEFAULT 只影响当前所在 PDB。比如在 QMS 执行,只影响 QMS;在 IETQMS 执行,只影响 IETQMS。如果有多个 PDB,需要分别切换进去执行:
alter session set container=QMS;
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;
alter session set container=IETQMS;
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;
alter session set container=YJXT;
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;
已经处于 EXPIRED & LOCKED 的用户,不会因为修改 Profile 自动变成 OPEN。这类用户大多是 Oracle 组件用户、示例用户或历史遗留用户,生产环境不建议随便解锁。
七、总结
Oracle 用户密码是否过期,不是直接修改 DBA_USERS.EXPIRY_DATE,而是通过 Profile 里的 PASSWORD_LIFE_TIME 控制。
生产环境推荐配置:
PASSWORD_LIFE_TIME UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7
应用账号可以设置密码永不过期,但失败登录锁定策略不要关闭。业务要稳,安全的门栓也要留着。