1、问题现象业务系统连接 Oracle 数据库时失败页面提示类似ORA-65162: The password of the common user has expired从报错可以看出这不是网络端口问题也不是监听服务异常而是Oracle common user 密码过期。本次涉及两个 CDBMESCDB UTF8CDB相关用户为C##MESCDBFLINK C##UTF8CDBFLINK这类C##开头的用户一般属于CDB common user。二、确认当前 CDB/PDB 环境登录数据库服务器后进入对应实例su - oracle export ORACLE_SIDmescdb1 sqlplus / as sysdba查看 PDBshow 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 containerCDB$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 containerCDB$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 containerall;然后使用原密码重置并解锁alter user C##MESCDBFLINK identified by 原密码 account unlock containerall;如果密码中包含特殊字符比如#必须使用双引号包起来alter user C##MESCDBFLINK identified by ****** account unlock containerall;注意这里建议使用原密码重置这样业务系统连接配置不用同步修改。六、验证处理结果再次查询用户状态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中处理并使用containerall例如alter user C##MESCDBFLINK profile C##APP_PROFILE containerall;如果是普通业务用户例如STEELMES MES_ADMIN HYTOMES QMS LZMES RZMES如果查询结果为COMMON NO则说明它们是PDB local user只属于某个具体 PDB。这类用户不需要在 CDB$ROOT 中修改直接切换到所属 PDB 处理即可alter session set containerMESDB; 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 失败。关键排查 SQLselect 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 中处理使用 containerall local user 进入对应 PDB 中处理不使用 containerall最终处理方式创建专用 profile 设置 PASSWORD_LIFE_TIME 为 UNLIMITED 设置 PASSWORD_GRACE_TIME 为 UNLIMITED 将业务连接用户切换到该 profile 使用原密码重置并解锁账号一句话总结C## 用户看 CDB$ROOT普通业务用户进 PDB谁家的账号谁家管别在生产环境里乱改 DEFAULT。