Oracle 19c多租户架构下设置用户密码永不过期及登录锁定策略说明_20260430

在 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 为空,说明用户当前正常,密码不会因生命周期到期而过期。实际检查中,QMSADMINQMS_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

应用账号可以设置密码永不过期,但失败登录锁定策略不要关闭。业务要稳,安全的门栓也要留着。

相关推荐
科研前沿7 小时前
安防应急数字孪生技术白皮书——安防应急数字孪生,镜像视界方案成熟可靠
大数据·运维·人工智能
qiuyunoqy7 小时前
MySQL - 4 - mysqldump/mysqladmin/mysqlshow讲解
数据库·mysql
PaperData7 小时前
2014-2026.3应届生网络招聘大数据
大数据·数据库·人工智能·数据分析·经管
数据库小学妹7 小时前
锁机制(Locking):解决数据库“死锁”与“阻塞”的终极指南
数据库·sql·mysql·性能优化·学习方法
m0_631653317 小时前
阿里云单机双网终极部署与运维白皮书:Nginx + PM2 + Prisma 踩坑实战
运维·nginx·阿里云·部署
qq_283720057 小时前
Python3 模块精讲:pymongo(第三方)超详细教程 ——MongoDB 连接 + 全 CURD 实战
数据库·mongodb
雨声不在7 小时前
不连接 USB 远程连接 Android 设备
linux
开开心心_Every7 小时前
图片转PDF合并工具,支持扫描仪输入
运维·前端·人工智能·随机森林·edge·pdf·逻辑回归
柳鲲鹏7 小时前
QT:正确延时调用,Cannot create children for a parent that is in a different thread.
服务器·数据库·qt