一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何修复Oracle用户登录时出现ORA-01017错误

时间:2026-08-23 09:39:49 编辑:袖梨 来源:一聚教程网

ORA-01017本质是认证失败而非连接失败,需优先排查密码大小写敏感(SEC_CASE_SENSITIVE_LOGON=TRUE)、密码文件缺失/损坏(v$pwfile_users为空)、账户状态异常(锁定/过期/无CREATE SESSION权限)、PDB上下文错误、引号及BOM等传参干扰。

ORA-01017 几乎总是认证失败,不是连不上,而是连上了却验不过——优先查大小写敏感、密码文件、账户状态这三块,别一上来就重装客户端或改防火墙。

确认 SEC_CASE_SENSITIVE_LOGON 是否为 TRUE

Oracle 11g 起默认开启密码大小写校验,设为 TRUE 后,Password=Abc123!Password=abc123! 就是两个不同密码。

  1. 用 SQL*Plus 连接时必须显式加英文双引号:sqlplus "scott/TiGeR@123"@orcl,否则 shell 或 IDE 可能提前截断或转义
  2. 执行 SHOW PARAMETER sec_case_sensitive_logon; 查当前值;若返回 TRUE,说明服务端在严格字节比对
  3. Windows 下从记事本/邮件复制的密码极易带 BOM 或末尾换行符,sqlplus 不报错但 .NET 驱动会原样传给 Oracle 导致比对失败

检查 sysdba 用户是否缺失密码文件

远程用 syssystemas sysdba 登录报 ORA-01017,但普通用户正常?大概率是密码文件没建或损坏。

  1. SELECT * FROM v$pwfile_users;,结果为空就说明没生效的密码文件
  2. orapwd 重建(路径需匹配你的 $ORACLE_HOME):orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=your_new_pwd entries=10
  3. 注意:RAC 环境每个节点都要单独执行,且文件名要带实例名,如 orapwprod1

.NET 连接字符串中 User Id 和 Password 的引号陷阱

Oracle.ManagedDataAccess 对引号和转义极其敏感,错一个符号就传错密码。

  1. 用户名含小写字母或下划线?必须加双引号:User Id="my_user";,否则 Oracle 当作 MY_USER
  2. 密码含 @/:$?必须用英文双引号包裹:Password="Pass@123";
  3. C# 普通字符串里反斜杠要双写:Password="password";;更稳妥用逐字字符串:@'User Id=scott; Password="TiGeR@123";'
  4. appsettings.json 或环境变量读取?务必调用 .Trim(),尤其 Windows 配置常带 UTF-8 BOM 或空格

账户状态、权限与 PDB 上下文被忽略的细节

ORA-01017 是“兜底错误”,账户锁定、过期、无 CREATE SESSION 权限,甚至连错 PDB,都可能统一返回这个码。

  1. 查账户状态:SELECT username, account_status FROM dba_users WHERE username = 'SCOTT';EXPIRED & LOCKEDLOCKED 都会导致 ORA-01017
  2. 确认权限:SELECT * FROM dba_sys_privs WHERE grantee = 'SCOTT' AND privilege = 'CREATE SESSION';
  3. Oracle 12c+ 容器库环境下,tnsnames.ora 中的 SERVICE_NAME 必须指向正确的 PDB(如 PDBORCL),不能只写 CDB 名
  4. 连接池开启时(默认),首次认证失败的连接可能被复用,后续 Open() 仍报 ORA-01017;临时加 Pooling=false; Connection Timeout=5; 可隔离问题

真正难排查的点往往不在密码本身,而在密码怎么被传进去——引号、BOM、PDB 名、密码文件存在性、连接池缓存,这些环节任何一个出偏移,都会让“明明输对了”变成“服务端根本没收到对的字节”。

热门栏目