`

TNSNAMES配置中空格导致的bug(转)

 
阅读更多

 

发现一个很有趣的bug,TNSNAMES.ORA中缺少空格导致ORA-12154错误。

 

 

还是看一个具体的例子:

 

TEST08 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.13.229)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = test08)

)

)

 

由于网页显示的时候,会自动吞掉所有的前导空格,下面将上面真正的配置中的前导空格用下划线来代替:

 

TEST08 =

__(DESCRIPTION =

____(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.13.229)(PORT = 1521))

____(CONNECT_DATA =

______(SERVER = DEDICATED)

______(SERVICE_NAME = test08)

____)

__)

 

这是一个普通到不能再普通的TNS配置了。

 

下面通过这个配置来连接数据库:

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 7月 13 21:02:36 2009

 

Copyright (c) 1982, 2005, Oracle. All rights reserved.

 

SQL> conn test/test@test08已连接。

 

显然可以连接到目标数据库。

 

下面将配置里面的前导空格完全删除:

 

TEST08 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.13.229)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = test08)

)

)

 

这次没有必要用下划线替换前导空格了,因为二者的格式完全一样。

 

再次连接数据库:

 

SQL> conn test/test@test08

ERROR:

ORA-12154: TNS: 无法解析指定的连接标识符

 

警告: 您不再连接到 ORACLE。

 

很奇怪,只是删除了一些无关紧要的空格,就导致了TNSNAMES解析错误。

 

于是逐渐的还原空格,寻找到底是哪里的空格被删除后,导致了这个错误的产生:

 

TEST08 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.13.229)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = test08)

)

)

 

最终发现其他的空格都无所谓,只是SERVICE_NAME下一行的前导空格会影响TNSNAMES的解析。

 

替换下划线的版本为:

 

TEST08 =

__(DESCRIPTION =

____(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.13.229)(PORT = 1521))

____(CONNECT_DATA =

______(SERVER = DEDICATED)

______(SERVICE_NAME = test08)

)

__)

 

这时连接就会报错:

 

SQL> conn test/test@test08

ERROR:

ORA-12154: TNS: 无法解析指定的连接标识符

 

而只要在这一行前面加上一个空格,或者删除掉SERVICE_NAME这一行的回车换行符,使得这个括号回到SERVICE_NAME的同一行,都可以顺利的连接到目标数据库。

 

使用TNSPING命令监测,发现这种情况下,TNSNAME在解析的时候丢失了最后两个右括号信息,造成ORA-12533错误:

 

E:>tnsping test08

 

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 13-7月 -

2009 21:27:10

 

Copyright (c) 1997, 2005, Oracle. All rights reserved.

 

已使用的参数文件:

E:\ORACLE\ORACLE1020\network\admin\sqlnet.ora

 

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.1

3.229)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test08

)

TNS-12533: TNS: 非法的 ADDRESS 参数

 

而正常的TNSNAMES解析如下:

 

E:>tnsping test08

 

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 13-7月 -

2009 21:29:00

 

Copyright (c) 1997, 2005, Oracle. All rights reserved.

 

已使用的参数文件:

E:\ORACLE\ORACLE1020\network\admin\sqlnet.ora

 

已使用 TNSNAMES 适配器来解析别名

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.1

3.229)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test08

)))

OK (270 毫秒)

 

上面的测试是在10.2.0.1的windows版本上进行的。

 

在9i上测试发现同样的问题,不过错误信息略有区别:

 

SQL*Plus: Release 9.2.0.4.0 - Production on 星期一 7月 13 21:32:34 2009

 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

 

SQL> conn test/test@test08

ERROR:

ORA-12154: TNS: 无法处理服务名

 

最后看看11g的情况:

 

E:>sqlplus /nolog

 

SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 7月 13 21:36:38 2009

 

Copyright (c) 1982, 2007, Oracle. All rights reserved.

 

SQL> conn test/test@test08

ERROR:

ORA-12154: TNS: 无法解析指定的连接标识符

 

11g中的错误和10g一致,不知道是否Oracle根本没有发现这个问题。这么简单的错误居然在3个大版本中都存在

 

分享到:
评论

相关推荐

    ORACLE配置tnsnames.ora文件详解

    ORACLE配置tnsnames.ora文件实例 客户机为了和服务器连接,必须先和服务器上的监听进程联络。ORACLE通过tnsnames.ora文件中的连接描述符来说明连接信息。 一般tnsnames.ora 是建立在客户机上的。如果是客户机/服务器...

    tnsnames.ora配置

    【tnsnames.ora配置】是Oracle数据库网络配置中的一个重要组成部分,主要负责将易于记忆的TNS名称映射到实际的主机名或IP地址以及相关的服务信息。tnsnames.ora文件通常位于$ORACLE_HOME/network/admin目录下,与...

    oracle修改配置tnsnames

    oracle修改配置tnsnames

    tnsnames.ora 配置文件

    tnsnames.ora 配置文件

    11Grac tnsnames配置.txt

    11Grac tnsnames配置

    listener与tnsnames配置示例

    Oracle数据库系统是企业级广泛应用的关系型数据库管理系统,其在服务器端的网络通信主要依赖于Listener(监听器)和tnsnames.ora配置。这两个组件对于数据库的连接和管理至关重要。本文将详细介绍这两个组件以及如何...

    oracle服务端配置 tnsnames

    oracle服务端配置 tnsnamesoracle服务端配置 tnsnamesoracle服务端配置 tnsnames

    oracle TNS 配置示例(tnsnames)

    在这个配置示例中,我们将深入探讨如何配置`tnsnames.ora`文件,这是Oracle TNS的主要配置文件。 首先,打开`tnsnames.ora`文件,通常它位于Oracle客户端的网络配置目录下,例如在Windows系统中可能是`%ORACLE_HOME...

    Oracle的tnsnames.ora配置(PLSQL Developer)

    ### Oracle的tnsnames.ora配置(PLSQL Developer) 在Oracle数据库环境中,为了实现客户端与服务器之间的连接,需要正确配置一系列环境变量以及相关的配置文件。其中,`tnsnames.ora`是Oracle客户端用于存储连接描述...

    tnsnames.ora 配置示例

    Oracle\Network\ADMIN\tnsnames.ora

    oracle网络配置 tnsnames.ora

    通过合理配置`sqlnet.ora`、`tnsnames.ora`和`listener.ora`这三个文件,可以确保Oracle数据库能够正常地在网络环境中被访问。理解这些配置文件的工作原理对于管理和维护Oracle数据库至关重要。

    配置ORACLE的listener.ora、tnsnames.ora

    在Oracle数据库的运行过程中,`listener.ora`和`tnsnames.ora`是两个至关重要的配置文件,它们负责管理和通信数据库实例与客户端应用程序之间的连接。 `listener.ora`文件是Oracle监听器的配置文件,它定义了监听器...

    tnsnames.ora配置文件

    tnsnames.ora配置文件,免安装使用pl/sql连接远程数据库

    tnsnames.ora 下载

    使用plsql developer 时,需要的配置文件 tnsnames.ora 下载

    常用Dos命令和Oracle数据库tnsnames.ora配置

    例如,如果你的Oracle数据库运行在名为dbserver的主机上,端口为1521,服务名为orcl,那么tnsnames.ora中的配置可能如下: ```text ORCL_CONNECTION = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db...

    配置好的listener.ora和tnsnames.ora

    在Oracle数据库系统中,`listener.ora`和`tnsnames.ora`是两个至关重要的配置文件,它们负责网络通信和连接管理。这两个文件对于Oracle数据库的正常运行和客户端应用程序如PL/SQL Developer的顺利连接至关重要。 ...

    plsql配置tnsnames.ora的实现方法

    在Oracle数据库的使用过程中,PL/SQL Developer是一款常用的开发工具,它需要通过配置`tnsnames.ora`文件来连接远程或本地的数据库实例。`tnsnames.ora`文件是Oracle网络配置的一部分,用于定义数据库连接的别名,...

    tnsnames tnsnames tnsnames

    tnsnames tnsnames tnsnames

    认识oracle中的sqlnet.ora tnsnames.ora listener.ora三个文件

    ### 认识Oracle中的sqlnet.ora、tnsnames.ora与listener.ora三个关键配置文件 #### 一、概述 在Oracle安装过程中,我们常常会在安装目录下的`$HOME/network/admin`文件夹中发现三个重要的配置文件:`sqlnet.ora`、...

    tnsnames2013-2-22

    `tnsnames.ora`、`listener.ora`和`sqlnet.ora`是Oracle数据库配置中的三个关键文件,它们对于数据库连接和通信至关重要。让我们详细了解一下这三个文件及其作用。 1. **tnsnames.ora文件**: `tnsnames.ora`文件...

Global site tag (gtag.js) - Google Analytics