sqlplus连接数据库报ORA-21561: OID Generation Failed

本文介绍了一个在升级到Oracle 10.2.0.x版本后使用SQL*Plus连接数据库时出现ORA-21561错误的问题,并提供了详细的解决方案,即检查并修复客户端hosts文件中的本地节点映射。


sqlplus连接数据库报ORA-21561: OID Generation Failed

Symptoms
 After upgrading to version 10.2.0.x, SQL*Plus connections fail with the following error:
ORA-21561 : OID generation failed
-bash-2.05b$ sqlplus username/password@tns_connect_string
SQL*Plus: Release 10.2.0.3.0 - Production on Fri Mar 7 16:15:10 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-21561 : OID generation failed
Enter user-name: <username>/<password> @ <tns connect string>
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining options
SQL>

Cause
Incorrect /etc/hosts mapping for the client machine or no mapping at all. 

Solution
Check the client's /.../hosts file and verify that the local node is correctly identified with a mapping for both the short and fully qualified name of the host.

我遇到问题的原因是由于hosts文件的权限被改了导致的错误,权限改回去,再次连接正常

 

ORA-12514 错误通常表示 Oracle 客户端尝试连接数据库时,监听器无法识别请求的服务名或 SID。在 Oracle 12c 中,由于引入了多租户架构(CDB/PDB),服务名的配置和连接方式与传统数据库有所不同,因此需要特别注意配置细节。 ### 问题原因分析 - **监听器未正确配置服务名**:监听器的 `listener.ora` 文件中未定义 PDB 对应的 `SID_LIST` 或 `GLOBAL_DBNAME`。 - **服务名未在数据库中注册**:PDB 的服务名未在数据库中注册,导致监听器无法动态注册该服务。 - **连接字符串配置错误**:客户端的 `tnsnames.ora` 中配置的服务名与数据库服务名不一致。 - **监听器未启动或未重新加载配置**:监听器服务未启动或未加载更新后的配置文件。 ### 解决方法 #### 1. 修改 `listener.ora` 文件 确保监听器配置文件中包含 CDB 和 PDB 的服务注册信息。以 Oracle 12c 为例,修改 `/network/admin/listener.ora` 文件,添加如下内容: ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) # CDB 服务名 (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1) (SID_NAME = orcl) ) (SID_DESC = (GLOBAL_DBNAME = pdborcl) # PDB 服务名 (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1) (SID_NAME = pdborcl) ) ) ``` 保存文件后,重启监听器服务以应用更改: ```bash lsnrctl stop lsnrctl start ``` #### 2. 检查数据库服务注册状态 连接数据库并查询当前注册的服务名: ```sql SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> select name, pdb from v$services; NAME PDB -------------------------------- -------------------- orcl CDB$ROOT pdborcl PDBORCL ``` 确保 `pdborcl` 服务名已注册。如果没有注册,可以手动注册: ```sql SQL> alter system set service_names='pdborcl' scope=both; ``` #### 3. 配置客户端 `tnsnames.ora` 在客户端的 `tnsnames.ora` 文件中添加 PDB 的连接描述符: ```ini PDBORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host_name)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdborcl) ) ) ``` #### 4. 使用 SQL*Plus 验证连接 尝试使用 `tnsping` 和 `sqlplus` 测试连接: ```bash tnsping pdborcl sqlplus username/password@pdborcl ``` #### 5. 检查监听器状态 使用以下命令查看监听器是否识别 PDB 服务: ```bash lsnrctl status ``` 在输出中应看到 `Service "pdborcl" has 1 instance(s)`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值