TNSNAMES已正确配置RACDB,sqlplus user/pass@RACDB一直报错ORA-12154

本文介绍了解决ORA-12154错误的过程,该错误出现在尝试使用新创建的操作系统用户连接到Oracle数据库时。通过检查监听状态、tnsnames.ora文件权限及OS用户组设置,最终确定问题是由于新用户缺少必要的文件读取权限。
一、问题现象
模拟真实生产环境,新建一个操作系统用户test,并设置ORACLE_HOME,ORACLE_SID后,运行以下命令,报错ORA-12154
[test@node2 ~]$ sqlplus system/oracle@RACDB
SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 23 16:59:22 2018
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified。

在同一台机器,使用OS用户oracle进行连接,可以正常联接。
[oracle@node2 ~]$ sqlplus system/oracle@RACDB
SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 23 17:05:10 2018
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> select status from v$instance;
STATUS
------------
OPEN


二、基础环境配置
[oracle@node2 ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
RACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.us.oracle.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RACDB.us.oracle.com)
    )
  )


三、分析过程
1.查看监听是否正常
[grid@node2 ~]$ lsnrctl status LISTENER_SCAN1
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 23-JAN-2018 17:07:25
Copyright (c) 1991, 2011, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER_SCAN1
Version                   TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date                23-JAN-2018 16:56:39
Uptime                    0 days 0 hr. 10 min. 46 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/11.2.0/grid/log/diag/tnslsnr/node2/listener_scan1/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.118.38)(PORT=1521)))
Services Summary...
Service "RACDB.us.oracle.com" has 1 instance(s).
  Instance "RACDB2", status READY, has 1 handler(s) for this service...
Service "RACDBXDB.us.oracle.com" has 1 instance(s).
  Instance "RACDB2", status READY, has 1 handler(s) for this service...
The command completed successfully


基于以上内容来看,未发现问题,说明监听没有问题。

2、查看$ORACLE_HOME/network/admin/tnsnames.ora文件权限
[oracle@node2 ~]$ ll $ORACLE_HOME/network/admin/tnsnames.ora
-rw-r----- 1 oracle oinstall 357 Jan 23 10:50 /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora


3、查看OS系统用户oracle和test的组是否正确
[oracle@node2 ~]$ id oracle
uid=500(oracle) gid=513(oinstall) groups=513(oinstall),511(asmdba),514(dba)
[oracle@node2 ~]$ id test
uid=1102(test) gid=1102(test) groups=1102(test)


oracle有权读取tnsnames.ora,但test不在oinstall组,属于other组,从tnsnames.ora的权限来看,test用户应该没有读取权限,难道是权限问题?


4.确认是否是tnsnames.ora文件权限问题
运行以下命令修改tnsnames.ora文件的权限
[oracle@node2 ~]$ chmod o+r $ORACLE_HOME/network/admin/tnsnames.ora


再次用test用户运行sqlplus,一切正常。
[test@node2 ~]$ sqlplus system/oracle@RACDB
SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 23 17:16:44 2018
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options


SQL> select status from v$instance;
STATUS
------------
OPEN





四、结论
运行SQLPLUS命令前,需要确保OS用户对$ORACLE_HOME/tnsnames.ora文件有读取权限,否则,无法通过TNSNAMES进行连接。







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

转载于:http://blog.itpub.net/31448585/viewspace-2150438/

ORA-12154 错误表示 SQL*Plus 无法解析连接标识符(即 `@sid` 部分),这通常与 Oracle Net 配置有关。以下是解决此问题的详细步骤: ### 1. 检查 `tnsnames.ora` 文件是否存在且配置正确 确保在 Oracle 客户端的 `network/admin` 目录下存在 `tnsnames.ora` 文件,并且其中定义了目标数据库的连接描述符。例如: ```ora CHENHAO01 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = your_service_name) ) ) ``` 确认文件路径是否正确,并将环境变量 `TNS_ADMIN` 设置为该目录路径,以确保 Oracle 工具能够找到该文件[^3]。 ### 2. 设置 `TNS_ADMIN` 环境变量 在操作系统中设置 `TNS_ADMIN` 环境变量,指向 `tnsnames.ora` 文件所在的目录。例如,在 Windows 上可以通过以下命令设置: ```bash set TNS_ADMIN=C:\oracle\network\admin ``` 或者在 Linux/Unix 上: ```bash export TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin ``` ### 3. 使用 `tnsping` 验证 TNS 配置 运行 `tnsping` 命令测试连接描述符是否可解析: ```bash tnsping chenhao01 ``` 如果 `tnsping` 成功,则说明 `tnsnames.ora` 文件配置正确;如果失败,则需要检查文件内容或路径设置[^2]。 ### 4. 确认 SQL*Plus 使用的 Oracle Home 确保 SQL*Plus 使用的 Oracle Home 与配置 `tnsnames.ora` 的位置一致。可以使用以下命令查看当前 SQL*Plus 的版本和 Oracle Home: ```bash sqlplus -v ``` 如果存在多个 Oracle 安装版本,可能需要调整 `PATH` 环境变量,确保调用的是正确的 SQL*Plus 版本。 ### 5. 检查网络连接和监听器配置 确保数据库服务器上的监听器(Listener)正在运行,并且配置正确。可以使用以下命令检查监听器状态: ```bash lsnrctl status ``` 同时确认 `listener.ora` 中是否配置正确的服务名和地址。 ### 6. 使用完整连接字符串作为替代方案 如果 `tnsnames.ora` 配置仍然存在问题,可以尝试直接使用完整连接字符串进行连接,例如: ```bash sqlplus system/oracle@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=your_host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=your_service_name)))" ``` ### 7. 验证用户名、密码和连接标识符 确保输入的用户名、密码和连接标识符(SID 或 Service Name)正确无误。错误的拼写或大小写不匹配都可能导致连接失败。 ### 8. 检查 Oracle 客户端安装 如果以上步骤均未解决问题,可能需要重新安装或修复 Oracle 客户端,以确保所有网络配置文件和库文件完整无误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值