登录失败主因是连接容器错误而非密码错误:需先show con_name确认当前容器,若为CDB$ROOT则用show pdbs查PDB状态,再alter session set container=PDB名切换,远程登录必须指定PDB service_name。
直接说结论:登录失败绝大多数不是密码输错,而是连接上下文错了——你连到了CDB$ROOT,但用户在PDB里。
很多人一上来就重置密码,其实根本没连对地方。先执行:
SQL> show con_name;
如果返回 CDB$ROOT,那说明你还在根容器里。而 PDB 用户(比如 TEST、FLINK_USER)只存在于某个具体 PDB 中,CDB$ROOT 里查不到他们,自然也认证不了。
show pdbs; 查看当前 CDB 下有哪些 PDB 及其状态(READ WRITE 才能登录)MESDB,执行 alter session set container=MESDB; 切换过去再试alter session 只影响当前会话,退出 SQL*Plus 就失效即使你在 SQL*Plus 里手动切换了 container,用 conn user/pass 仍会回到 CDB$ROOT——这是 Oracle 的默认行为。真正远程登录时,必须显式指定 PDB 的服务名:
$ORACLE_HOME/network/admin/tnsnames.ora 是否有对应 PDB 的条目,例如:MEPDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = MEPDB)))
sqlplus user/pass@localhost:1521/MEPDB,不能省略 /MEPDB
jdbc:oracle:thin:@//host:port/MEPDB,不是 @//host:port/ORCL(后者通常是 CDB 名)从旧版 Oracle 升级到 19c 后,老用户密码可能只存了 10G 或 11G 哈希,而 19c 默认要求 12C 哈希才能认证。查一下:
SELECT username, password_versions FROM dba_users WHERE username = 'YOUR_USER';
如果结果是 10G 11G 但没有 12C,说明密码不被新协议认可:
alter user YOUR_USER identified by <same_password> reuse; (注意加 reuse 保留原密码文本,但强制生成新哈希)$ORACLE_HOME/network/admin/sqlnet.ora 加一行 SQLNET.ALLOWED_LOGON_VERSION_SERVER=11
show parameter sec_case_sensitive_logon,若为 TRUE,密码必须完全匹配大小写很多问题卡在看似无关的细节上:
READ WRITE:alter pluggable database MEPDB open; 才行,MOUNTED 或 RESTRICTED 都无法登录普通用户C## 开头却想在 PDB 里用:那是 common user,必须在 CDB$ROOT 创建并设密码,且所有 PDB 共享同一密码;如果只是 PDB 内部用户,用户名不要带 C##
/、@)必须用单引号包裹,例如 impdp 'user/"p@sswd"'@MEPDB ...
多租户环境下,“用户在哪创建”和“从哪连进去”必须严格对应,差一层 container 就全盘失效。别猜,先 show con_name 和 show pdbs,再动手。
小米路由器3G怎么恢复出厂设置(小米路由器3G该如何恢复出厂设置)
小米路由器3g和4a千兆版哪个好(小米路由器3g和4a千兆版对比区别)
Sensor Tower:ChatGPT全球份额跌破50%,Gemini与Claude加速追赶
OpenAI提速狂飙16倍!GPT-5.6多智能体V2上线,741轮怪物对话1秒打开
“十五五”时期 煤矿危险繁重岗位将由机器人替代
waytouniverse/ppt-generator:从 Markdown 大纲生成风格统一的 PPT 图片