当前位置: 首页 > news >正文

ODA/Oracle 19c CDB/PDB 环境下报错ORA-65162:common user密码过期问题排查与处理_2026-05-15

1、问题现象

业务系统连接 Oracle 数据库时失败,页面提示类似:

ORA-65162: The password of the common user has expired

从报错可以看出,这不是网络端口问题,也不是监听服务异常,而是Oracle common user 密码过期

本次涉及两个 CDB:

MESCDB UTF8CDB

相关用户为:

C##MESCDBFLINK C##UTF8CDBFLINK

这类C##开头的用户,一般属于CDB common user


二、确认当前 CDB/PDB 环境

登录数据库服务器后,进入对应实例:

su - oracle export ORACLE_SID=mescdb1 sqlplus / as sysdba

查看 PDB:

show pdbs;

示例结果:

CON_ID CON_NAME OPEN MODE ------ -------- ---------- 2 PDB$SEED READ ONLY 3 MESDB READ WRITE 5 RZMESDB READ WRITE

确认当前容器:

show con_name;

如果是 common user,建议在CDB$ROOT下处理。

alter session set container=CDB$ROOT;

三、查询用户状态

先通过cdb_users查询用户状态:

set lines 200 pages 200 col con_name for a15 col username for a35 col account_status for a30 col expiry_date for a20 col profile for a25 col common for a8 select u.con_id, c.name con_name, u.username, u.account_status, u.expiry_date, u.profile, u.common from cdb_users u join v$containers c on u.con_id = c.con_id where u.username = upper('C##MESCDBFLINK') order by u.con_id;

排查结果如下:

CON_ID CON_NAME USERNAME ACCOUNT_STATUS EXPIRY_DATE PROFILE COMMON ------ -------- -------------- -------------- ------------------- ------- ------ 1 CDB$ROOT C##MESCDBFLINK EXPIRED 2026-05-13 09:57:06 DEFAULT YES 3 MESDB C##MESCDBFLINK OPEN DEFAULT YES 5 RZMESDB C##MESCDBFLINK OPEN DEFAULT YES

这里可以明确看出:

CDB$ROOT 下账号状态为 EXPIRED

虽然 PDB 中显示为OPEN,但是 common user 在 CDB$ROOT 中密码过期后,连接 PDB 仍然会失败。


四、创建专用 Profile,设置密码永不过期

生产环境不建议直接修改DEFAULTprofile,因为可能影响其他用户。

更稳妥的方式是:单独创建业务账号专用 profile

alter session set container=CDB$ROOT;

先检查 profile 是否存在:

select profile from dba_profiles where profile = 'C##APP_PROFILE' group by profile;

如果不存在,创建:

create profile C##APP_PROFILE limit PASSWORD_LIFE_TIME UNLIMITED PASSWORD_GRACE_TIME UNLIMITED;

说明:

PASSWORD_LIFE_TIME UNLIMITED 表示密码永不过期 PASSWORD_GRACE_TIME UNLIMITED 表示不进入密码过期宽限期

五、将 common user 切换到新 Profile

C##MESCDBFLINK为例:

alter user C##MESCDBFLINK profile C##APP_PROFILE container=all;

然后使用原密码重置并解锁:

alter user C##MESCDBFLINK identified by "原密码" account unlock container=all;

如果密码中包含特殊字符,比如#,必须使用双引号包起来:

alter user C##MESCDBFLINK identified by "******" account unlock container=all;

注意:
这里建议使用原密码重置,这样业务系统连接配置不用同步修改。


六、验证处理结果

再次查询用户状态:

select u.con_id, c.name con_name, u.username, u.account_status, u.expiry_date, u.profile, u.common from cdb_users u join v$containers c on u.con_id = c.con_id where u.username = 'C##MESCDBFLINK' order by u.con_id;

正常结果应类似:

CON_ID CON_NAME USERNAME ACCOUNT_STATUS EXPIRY_DATE PROFILE COMMON ------ -------- -------------- -------------- ----------- --------------- ------ 1 CDB$ROOT C##MESCDBFLINK OPEN C##APP_PROFILE YES 3 MESDB C##MESCDBFLINK OPEN C##APP_PROFILE YES 5 RZMESDB C##MESCDBFLINK OPEN C##APP_PROFILE YES

重点看三项:

ACCOUNT_STATUS = OPEN EXPIRY_DATE 为空 PROFILE = C##APP_PROFILE

再确认 profile 策略:

select profile, resource_name, limit from dba_profiles where profile = 'C##APP_PROFILE' and resource_name in ( 'PASSWORD_LIFE_TIME', 'PASSWORD_GRACE_TIME', 'FAILED_LOGIN_ATTEMPTS', 'PASSWORD_LOCK_TIME' ) order by resource_name;

示例结果:

PROFILE RESOURCE_NAME LIMIT --------------- --------------------- --------- C##APP_PROFILE FAILED_LOGIN_ATTEMPTS DEFAULT C##APP_PROFILE PASSWORD_GRACE_TIME UNLIMITED C##APP_PROFILE PASSWORD_LIFE_TIME UNLIMITED C##APP_PROFILE PASSWORD_LOCK_TIME DEFAULT

这里说明:

密码已经永不过期; 但如果密码连续输错,仍然可能按 DEFAULT 策略锁定。

七、CDB common user 和 PDB local user 的区别

本次处理的两个用户:

C##MESCDBFLINK C##UTF8CDBFLINK

都属于 common user,特点是:

用户名以 C## 开头 COMMON = YES

这种用户应在:

CDB$ROOT

中处理,并使用:

container=all

例如:

alter user C##MESCDBFLINK profile C##APP_PROFILE container=all;

如果是普通业务用户,例如:

STEELMES MES_ADMIN HYTOMES QMS LZMES RZMES

如果查询结果为:

COMMON = NO

则说明它们是PDB local user,只属于某个具体 PDB。

这类用户不需要在 CDB$ROOT 中修改,直接切换到所属 PDB 处理即可:

alter session set container=MESDB; create profile APP_PROFILE limit PASSWORD_LIFE_TIME UNLIMITED PASSWORD_GRACE_TIME UNLIMITED; alter user STEELMES profile APP_PROFILE;

如果账号已过期或锁定,再用原密码重置解锁:

alter user STEELMES identified by "原密码" account unlock;

八、总结

本次问题的核心原因是:

Oracle CDB common user 在 CDB$ROOT 中密码过期,导致业务系统连接 PDB 失败。

关键排查 SQL:

select u.con_id, c.name con_name, u.username, u.account_status, u.expiry_date, u.profile, u.common from cdb_users u join v$containers c on u.con_id = c.con_id where u.username = upper('用户名') order by u.con_id;

关键处理思路:

common user:在 CDB$ROOT 中处理,使用 container=all local user :进入对应 PDB 中处理,不使用 container=all

最终处理方式:

创建专用 profile 设置 PASSWORD_LIFE_TIME 为 UNLIMITED 设置 PASSWORD_GRACE_TIME 为 UNLIMITED 将业务连接用户切换到该 profile 使用原密码重置并解锁账号

一句话总结:
C## 用户看 CDB$ROOT,普通业务用户进 PDB;谁家的账号谁家管,别在生产环境里乱改 DEFAULT。

http://www.jsqmd.com/news/821679/

相关文章:

  • NomNom:如何用最智能的存档编辑器重新定义你的《无人深空》游戏体验
  • 用Arduino与加速度计打造可编程电子万花筒:从传感器原理到光学实现
  • 终极免费B站视频下载方案:BilibiliDown完整使用指南
  • 终极视觉小说翻译解决方案:LunaTranslator从零到精通完整指南
  • 声明式文本格式化:fancy-text-formatter 库的设计、实战与优化
  • 在Node.js服务中集成Taotoken实现多模型对话能力
  • 远程开发新思路:用VNC把AutoDL/矩池云的GPU服务器变成你的“图形工作站”
  • 油皮用什么水比较清爽?夏季护肤真人实测,速吸保湿长效控油不紧绷 - 博客万
  • 多开 Claude Code / Codex 看不过来?2k Star 开源神器,实时统计 AI 代理怎么跑!
  • 5个简单步骤掌握魔兽世界GSE宏编译器的技能自动化魔法
  • 小米智能家居全面接入HomeAssistant的终极指南:hass-xiaomi-miot深度解析
  • 河北单招培训机构避坑指南:真实体验下的靠谱选择 - 奔跑123
  • 5分钟让您的PS3手柄在Windows上重获新生:DsHidMini驱动完全指南
  • 基于LLM的GitHub智能体:自动化仓库管理与代码审查实战
  • 15分钟打造高颜值小程序:ColorUI色彩组件库终极指南
  • ubuntu20.04在Vscode上配置codex
  • 如何为Windows 11 LTSC系统3分钟恢复微软商店:完整安装指南
  • 【Appium 系列】第02节-环境搭建 — Android + iOS 双平台环境配置
  • 把“结”变成二维码:用新不变量区分97%的复杂结并将规模延伸至600个交叉
  • 多链钱包后端:助记词、私钥管理、地址生成、离线签名、交易广播
  • 从QSPI Flash到DDR:MicroBlaze BootLoader的加载与执行全解析
  • AI专著写作新利器,一键生成20万字专著,告别专著撰写难题!
  • 终极跨平台Unity资产提取神器:AssetRipper完整使用指南
  • ArcGIS遥感分析实战:从NDVI到土壤侵蚀的栅格运算全流程
  • 保姆级教程:手把手教你修改GC4653 Sensor帧率,从30fps降到20fps(附寄存器计算)
  • 2026降AI工具横评:效果/安全/适配性哪个更靠谱?
  • 量子噪声模拟与张量网络近似算法实践
  • 从零玩转STM32 HAL库:SG90舵机PWM驱动与智能小车转向实战
  • 告别SteamVR和VRTK!用Unity新输入系统+VRIF 2.0快速搞定Pico Neo3/4开发(含UI Bug修复)
  • 5分钟掌握LuckyLilliaBot:让QQ机器人开发变得简单的完整指南