11g升级到Oracle 12c碰到的问题(11g中不存在问题) - ORA-01792

本文介绍了解决Oracle数据库中ORA-01792错误的方法,包括调整查询或视图定义以避免错误,禁用检查,或者应用临时补丁。还提供了禁用错误检查的具体SQL命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle suggest to alter the query and/or view definitions to avoid the error. However in cases where the SQL cannot be adjusted then the checking can be disabled by:  

SQL> alter system set "_fix_control"='17376322:OFF';

Alternatively an interim patch for this fix (patch 19509982) can be applied to disable the error by default.

For details:
Bug 19509982 Disable raising of ORA-1792 by default
Select Statement Throws ORA-01792 Error

http://dba.stackexchange.com/questions/128621/understanding-ora-01792-maximum-number-of-columns-in-a-table-or-view-is-1000  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-2126716/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-2126716/

<think>我们正在解决的是Oracle11g客户端连接Oracle12c服务器时出现的ORA-01017错误(无效的用户名/密码)。根据引用[1]和[2],这个错误通常与认证协议匹配有关,因为Oracle12c默认使用更安全的认证协议,而旧版客户端(如11g)可能支持。 引用[1]提到:ORA-28040 "No matchingauthentication protocol",并指出需要设置SQLNET.ALLOWED_LOGON_VERSION参数来匹配客户端和服务器支持的最低协议版本。引用[2]则展示了使用10g客户端连接12c服务器时正常登录的案例,暗示了通过配置可以解决。因此,解决步骤应围绕调整服务器端的SQLNET.ALLOWED_LOGON_VERSION参数,以允许旧版客户端连接。 ###解决步骤:####1.在Oracle12c服务器上修改sqlnet.ora文件```bash#登录服务器,进入$ORACLE_HOME/network/admin目录cd$ORACLE_HOME/network/adminvi sqlnet.ora```添加或修改以下参数(根据客户端版本选择):```ini#允许使用11g客户端(11.2.0.4及以上)SQLNET.ALLOWED_LOGON_VERSION_SERVER=11SQLNET.ALLOWED_LOGON_VERSION_CLIENT=11#或者为了兼容更老的客户端(如10g),可设置为8#但注意:降低版本可能带来安全风险#SQLNET.ALLOWED_LOGON_VERSION_SERVER=8# SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8```> **注意**:设置`SQLNET.ALLOWED_LOGON_VERSION=11`允许11g客户端连接(11.2.0.4及以上版本)。如果客户端是11.2.0.3或更旧,需设置为8(参考引用[1])。####2.重启监听(可选,通常需要重启数据库) ```bashlsnrctl stoplsnrctlstart``` ####3.重置用户密码(重要!) **原因**:修改认证协议后,已存在的用户密码可能仍使用旧哈希算法存储,需要重置以生成兼容的哈希值。```sqlALTERUSER <用户名>IDENTIFIED BY<新密码>;``` 例如:```sqlALTERUSER scott IDENTIFIEDBY tiger; ```####4.客户端测试连接使用11g客户端重新连接:```bashsqlplus username/password@tns_alias``` ####5.备选方案(如果仍失败) 如果上述步骤无效,可尝试在服务器端设置: ```ini#在sqlnet.ora中添加(推荐,仅当上述方法无效时)SQLNET.ALLOWED_LOGON_VERSIONS=(11,10,9,8)``` >**安全警告**:允许低版本协议会降低安全性,仅作为临时解决方案。 ###原理说明:- Oracle12c默认使用SHA256等强加密算法,而11g客户端可能只支持DES或SHA1。-设置`SQLNET.ALLOWED_LOGON_VERSION`告诉服务器接受旧版认证协议。 -重置密码会使用新协议重新生成密码哈希(引用[2]中10g客户端能连接是因为服务器已配置兼容模式)。 ###故障排查表|现象 |解决方案||------|----------| |ORA-01017修改参数后仍出现 |重置用户密码(必须步骤) || ORA-28040:认证协议匹配|检查sqlnet.ora中参数设置并重启监听| |低版本客户端(如10g)需要连接 |设置SQLNET.ALLOWED_LOGON_VERSION=8| >**最佳实践**:升级客户端到12c版本以获得最佳兼容性和安全性[^2]。 ---###相关问题§§相关问题§§1.如何解决Oracle12c中的ORA-28000账户锁定问题? 2. Oracle数据库中如何配置密码策略? 3.如何诊断Oracle网络连接中的TNS-12560错误?</think>### 解决 Oracle 11g 客户端连接 Oracle 12c 服务器时的 ORA-01017 错误 **错误本质分析** ORA-01017 "invalid username/password; logon denied" 通常由认证协议匹配引起。Oracle 12c 默认使用更安全的认证协议(如 SHA256),而 Oracle 11g 客户端可能仅支持旧协议(如 SHA1)。引用[1][2]明确指出需配置 `SQLNET.ALLOWED_LOGON_VERSION` 参数解决协议兼容性问题--- ### 详细解决步骤 #### 1. 在 Oracle 12c 服务器端修改 `sqlnet.ora`(关键步骤) ```bash # 进入网络配置目录 cd $ORACLE_HOME/network/admin vi sqlnet.ora ``` 添加以下配置(兼容11g客户端): ```ini # 允许11g客户端连接(11.2.0.4及以上版本) SQLNET.ALLOWED_LOGON_VERSION_SERVER=11 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=11 # 如果仍失败,可尝试兼容更旧版本(安全风险较高) # SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 # SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 ``` > **说明**: > - 值 `11` 对应 Oracle 11.2.0.4+ 客户端 > - 值 `8` 兼容 Oracle 8i-10g 客户端(引用[1]) > - **必须重启监听生效**:`lsnrctl reload` #### 2. 重置用户密码(必需操作) 修改协议后,**必须重置用户密码**以生成兼容的密码哈希: ```sql --12c服务器执行 ALTER USER <用户名> IDENTIFIED BY <新密码>; ``` > **原因**:旧密码哈希可能兼容新认证协议(引用[2]示例中10g客户端成功即因密码重置)。 #### 3. 验证客户端兼容性 在11g客户端执行: ```bash sqlplus /nolog SQL> CONNECT username/password@tns_alias ``` 若仍失败,检查: - TNS配置是否正确(参考先前ORA-12545解决方案) - 客户端版本是否≥11.2.0.4(`sqlplus -v`) #### 4. 备选方案:升级客户端(推荐) 安装 **Oracle 12c 客户端** 或 **Oracle Instant Client 12c+**,彻底解决协议兼容问题--- ### 参数配置对照表 | 参数值 | 兼容客户端版本 | 安全性 | 推荐场景 | |--------|----------------|--------|----------| | 12 | 12c+ | 高 | 纯12c环境 | | 11 | 11.2.0.4+ | 中高 | **11g→12c** | | 8 | 8i-11.2.0.3 | 低 | 老旧系统 | --- ### 故障排查流程 ```mermaid graph TD A[ORA-01017] --> B{检查sqlnet.ora配置} B -->|已配置| C[重置用户密码] B -->|未配置| D[添加兼容参数] C --> E[测试连接] D --> C E -->|成功| F[解决] E -->|失败| G[检查TNS/防火墙] G --> H[升级客户端] ``` > **关键提示**: > - 同时存在 ORA-28040 错误时,必须设置 `SQLNET.ALLOWED_LOGON_VERSION`(引用[1]) > - 密码重置是必需步骤,否则协议修改无效(引用[2]实践验证) > - 生产环境建议升级客户端而非降低协议安全性 --- ### 预防性措施 1. **客户端标准化**:统一使用12c+客户端连接12c数据库 2. **密码策略同步**:迁移用户时主动重置密码 3. **安全审计**:定期检查 `sqlnet.ora` 配置: ```sql SELECT * FROM V$DIAG_INFO WHERE NAME = 'Default Trace File'; ``` 查看监听日志中的认证协议协商记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值