Oracle ORA-01017 报错处理

Oracle ORA-01017 报错处理

背景: 

通过toad连接Oracle 11g RAC数据库是,发现通过sys用户连接总是报ORA-01017错误,tnsping连接名称是通的,其他用户连接是正常的,反复输入sys账户信息,总提示:

1.尝试改sys用户密码,重试报错依旧。 
2.使用sys登录GC,报错相同。使用普通用户登录正常。 
3.数据库服务器上使用sqlplus sys/oracle1@prod_80 as sysdba也是报错。

问题排查和原因:
 

1.上述问题反映的现象是远程使用sys账户无法登录,因为已经更改过密码,首先排除密码错误。

2.查询v$pwfile_users表记录,发现是空, 


关于v$pwfile_users的描述:
V$PWFILE_USERS lists all users in the password file, and indicates whether the user has been granted the SYSDBA, SYSOPER, and SYSASM privileges.
为什么这显示的记录是空?接下来查看密码文件
3.进入$ORACLE_HOME/dbs,发现没有密码文件,因为sqlplus sys/oracle1@prod_80 as sysdba登录方式是通过密码验证,而dbs目录下缺少密码文件,导致无法登录。现在重建密码文件,再进行登录验证。


处理过程及结果:

1.创建密码文件,每个节点都进行创建:

orapwd file=/u01/app/oracle/product/11.2.0/db_1/dbs/orapwPROD1 password=oracle;
orapwd file=/u01/app/oracle/product/11.2.0/db_1/dbs/orapwPROD2 password=oracle;
2.再次查询查询v$pwfile_users表记录:

发现表里已经有sys用户数据了
3.进行登录验证:
(已将密码改为oracle)

已经能够连接数据库,toad也可以正常连接。






<think>我们正在解决JDBC连接Oracle时出现的ORA-01017错误。根据引用内容,该错误通常是由于用户名/密码无效或登录被拒绝引起的。结合多个引用,我们可以总结以下原因和解决方法:原因分析:1.用户名或密码错误(最常见原因)-引用[4][5]明确指出2.JDBC驱动版本与Oracle数据库版本不兼容-引用[1]提到ORACLE12c以上版本默认设置SQLNET.ALLOWED_LOGON_VERSION_SERVER=12,导致旧版JDBC驱动连接失败3.数据库服务配置问题-引用[2][3]涉及监听程序配置解决方法:1.验证用户名密码(基础检查):-使用SQL*Plus等工具直接登录验证-修改密码(引用[5]提供SQL命令):```sqlALTERUSER用户名IDENTIFIEDBY新密码;```2.调整数据库参数(针对版本兼容性问题):-修改sqlnet.ora文件(引用[1][2]):```SQLNET.ALLOWED_LOGON_VERSION_SERVER=8SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8```-添加兼容性参数(引用[2]):```sqlnet.authentication_services=(NTS)#Windows系统或sqlnet.authentication_services=(NONE)#Linux/Unix系统```3.检查数据库服务状态(引用[3]):-确认监听程序配置正确(listener.ora中SERVICE_NAME配置)-确保数据库实例已注册到监听程序4.更新JDBC驱动:-使用与Oracle数据库版本匹配的ojdbc驱动(如12c以上使用ojdbc8.jar)操作步骤:1.基础验证:-通过本地工具登录数据库,排除密码错误可能性2.驱动检查:-确认pom.xml/gradle中使用的ojdbc版本-Oracle12c及以上推荐ojdbc8(兼容JDK8+)3.配置文件修改(需DBA权限):-定位$ORACLE_HOME/network/admin/sqlnet.ora-添加兼容性参数(示例):```SQLNET.ALLOWED_LOGON_VERSION_SERVER=8SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8SQLNET.AUTHENTICATION_SERVICES=(NONE)```-重启监听:`lsnrctlreload`4.多租户环境注意(引用[4]):-CDB/PDB架构中需确保连接字符串指定正确PDB服务名-格式:`jdbc:oracle:thin:@//host:port/服务名`典型连接字符串示例:```java//标准SID连接jdbc:oracle:thin:@host:1521:SID//服务名连接(12c多租户推荐)jdbc:oracle:thin:@//host:1521/服务名```§§相关问题§§1.如何查询Oracle数据库当前版本?2.怎样确定JDBC驱动与Oracle数据库版本的兼容性?3.ORA-01017ORA-28040错误有何关联?4.CDB/PDB架构下用户认证有什么特殊要求?</think>### JDBC连接Oracle出现ORA-01017错误的解决方法 #### 错误原因分析 ORA-01017错误表示**用户名/密码无效,登录被拒绝**。根据引用资料,主要原因包括: 1. **用户名或密码错误**(最常见原因)[^4][^5] 2. **JDBC驱动与数据库版本不兼容**(Oracle 12c+默认启用高版本认证协议)[^1] 3. **多租户环境(CDB/PDB)配置问题**(未正确指定PDB服务)[^4] 4. **监听程序配置错误**(如服务名未注册)[^3] 5. **密码策略冲突**(如特殊字符处理)[^5] --- ### 解决方法步骤 #### 1. 基础验证(首先执行) ```sql -- 在数据库服务器执行(需DBA权限) SELECT * FROM dba_users WHERE username = '您的用户名'; ``` - 确认用户名大小写(Oracle默认大写) - 检查密码特殊字符是否需要转义[^5] - 使用SQL*Plus本地登录测试: ```bash sqlplus 用户名/密码@服务名 ``` #### 2. 驱动版本兼容性修复(针对Oracle 12c+) **方法1:升级JDBC驱动**(推荐) - 使用匹配的驱动版本: ```xml <!-- Maven配置示例 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <!-- Oracle 12c-21c用ojdbc8/ojdbc11 --> <version>21.9.0.0</version> </dependency> ``` **方法2:修改数据库配置**(需DBA权限) 编辑 `$ORACLE_HOME/network/admin/sqlnet.ora`: ```ini # 降低认证协议版本 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 # 根据操作系统添加 sqlnet.authentication_services=(NTS) # Windows sqlnet.authentication_services=(NONE) # Linux[^2] ``` **重启监听生效**: ```bash lsnrctl reload ``` #### 3. 多租户环境(CDB/PDB)配置 - **连接字符串必须指定PDB服务名**: ```java // 正确格式(注意双斜杠) jdbc:oracle:thin:@//host:1521/PDB服务名 ``` - **确认用户在PDB中存在**: ```sql ALTER SESSION SET CONTAINER=PDB名称; SELECT * FROM all_users; ``` #### 4. 密码重置(DBA操作) ```sql -- 强制修改密码(忽略复杂度) ALTER USER 用户名 IDENTIFIED BY "新密码" REPLACE "旧密码"; ``` #### 5. 监听程序检查 验证监听配置 `listener.ora`: ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = 全局服务名) (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (SID_NAME = SID) ) ) ``` --- ### 完整诊断流程 ```mermaid graph TD A[出现ORA-01017] --> B{本地SQL*Plus能登录吗?} B -->|能| C[检查JDBC连接字符串] B -->|不能| D[重置密码] C --> E{驱动版本是否匹配?} E -->|是| F[检查监听配置] E -->|否| G[升级JDBC驱动] F --> H{是否为CDB/PDB?} H -->|是| I[确认连接PDB服务名] H -->|否| J[检查sqlnet.ora参数] ``` > **注意**:生产环境修改`sqlnet.ora`会降低安全性,优先推荐升级驱动[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值