ITPub博客

首页 > Linux操作系统 > Linux操作系统 > TNSNAMES配置中空格导致的bug

TNSNAMES配置中空格导致的bug

原创 Linux操作系统 作者:yangtingkun 时间:2009-07-13 23:27:53 0 删除 编辑

发现一个很有趣的bugTNSNAMES.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.1windows版本上进行的。

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个大版本中都存在。

 

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

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10405619