You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 21c普通用户无法连接PDB报ORA-01017错误求助

ORA-01017: 无效用户名/密码;登录被拒绝(PDB连接场景)

针对Oracle 21c PDB普通用户连接报错的问题,按以下步骤逐一排查:

1. 确认用户创建与授权的容器正确性

登录CDB根容器,切换到目标PDB,验证用户是否在PDB内创建并拥有必要权限:

-- 切换到目标PDB
ALTER SESSION SET CONTAINER = <你的PDB名称>;
-- 检查用户存在性与状态
SELECT username, account_status, profile FROM dba_users WHERE username = '<你的用户名>';
-- 验证权限是否生效
SELECT privilege FROM dba_sys_privs WHERE grantee = '<你的用户名>' 
UNION ALL
SELECT privilege FROM dba_role_privs WHERE grantee = '<你的用户名>' AND granted_role = 'CONNECT';

注意:若用户在CDB$ROOT创建且非C##前缀的公用用户,无法直接访问PDB,必须在目标PDB内单独创建用户。

2. 验证密码大小写匹配

Oracle 12c及以后默认启用密码大小写敏感,执行以下命令确认参数,并确保连接时密码与创建时完全一致:

ALTER SESSION SET CONTAINER = <你的PDB名称>;
SELECT value FROM v$parameter WHERE name = 'sec_case_sensitive_logon';

若需临时关闭大小写敏感(不推荐生产环境),可执行:

ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE SCOPE=BOTH;

3. 检查环境变量与连接字符串

  • 本地连接时,确认ORACLE_SID指向目标PDB的SID:
    echo $ORACLE_SID
    
    若指向CDB的SID,需切换到PDB后再连接,或使用sqlplus <用户名>/<密码>@<PDB服务名>。
  • TNS连接时,检查tnsnames.ora中PDB的服务名配置:
    <PDB服务名> =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = <你的主机名>)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = <PDB的服务名>) -- 注意是SERVICE_NAME,而非SID
        )
      )
    
    可通过以下命令查询PDB的服务名:
    SELECT name, open_mode, service_name FROM v$pdbs;
    

4. 确认监听已注册PDB服务

检查监听状态,确认目标PDB服务已被注册:

lsnrctl status

若未注册,手动注册并重启监听:

ALTER SESSION SET CONTAINER = <你的PDB名称>;
ALTER SYSTEM REGISTER;
lsnrctl stop
lsnrctl start

5. 排查sqlnet.ora配置

确保认证参数未限制密码认证:

# sqlnet.ora中避免仅启用操作系统认证
SQLNET.AUTHENTICATION_SERVICES = (ALL)

若设置为(NTS)可能导致密码认证失败;设置为(NONE)则仅支持密码认证。

6. 验证/etc/hosts解析

确保主机名与IP映射正确,避免TNS解析异常:

cat /etc/hosts

需包含类似条目:

<你的服务器IP>  <你的主机名>  <主机别名>
127.0.0.1       localhost   localhost.localdomain

7. 排除用户锁定/密码过期

查询用户状态,确认未被锁定且密码未过期:

ALTER SESSION SET CONTAINER = <你的PDB名称>;
SELECT username, account_status, expiry_date FROM dba_users WHERE username = '<你的用户名>';

若用户锁定,执行解锁:

ALTER USER <你的用户名> ACCOUNT UNLOCK;

若密码过期,重置密码:

ALTER USER <你的用户名> IDENTIFIED BY <新密码>;

8. 测试不同连接方式定位问题

  • PDB内部直接测试连接:
    ALTER SESSION SET CONTAINER = <你的PDB名称>;
    CONNECT <你的用户名>/<你的密码>;
    
    若成功,说明问题出在TNS或环境变量配置。
  • 使用EZCONNECT方式测试:
    sqlplus <你的用户名>/<你的密码>@<主机名>:1521/<PDB服务名>
    

内容的提问来源于stack exchange,提问作者Azat Usmanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:54:50