[20130528]tnsnames.ora的格式问题.txt
--注:为了blog的显示问题,空格使用下划线.
40X =
(DESCRIPTION =
_(ADDRESS_LIST =
_(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.40)(PORT = 1521))
_)
_(CONNECT_DATA =
__(SERVER = DEDICATED)
__(SERVICE_NAME = test.com)
)
)
使用上面的连接数据库,会出现:
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
Enter user-name:
ERROR:
ORA-12560: TNS:protocol adapter error
d:\tools>tnsping 40X
TNS Ping Utility for 32-bit Windows: Version 11.1.0.7.0 - Production on 28-MAY-2013 11:54:50
Copyright (c) 1997, 2008, Oracle. All rights reserved.
Used parameter files:
e:\oracle\product\11.1.0\db_1\network\admin\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.40)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test.com)
TNS-12533: TNS:illegal ADDRESS parameters
参考老杨的帖子:
http://yangtingkun.net/?p=1294
http://yangtingkun.itpub.net/post/468/487506
问题的答案在看文档的时候被揭晓。原来Oracle的TNSNAMES.ORA中对格式存在要求,换行的下一行如果和上一行存在父子关系,则不能顶
头,至少要保留一个空格,来提示Oracle这不是一个新的配置,而是上面配置的继续。
根据文档的描述,对于子配置项,如果要单独一行,那么至少要在换行后保留一个空格,否则就应该与主配置同属一行。
本以为发现的是Oracle的一个bug,没想到却是文档中明确说明的特性,这就是文档没有看全就自以为是乱下判断的结果,引以为戒。
--如果按照我上面的配置,(DESCRIPTION = 前面没有空格,这个时候用net manager配置,根本无法打开"服务命名"配置界面.里面显示为空.
我的感觉这些问题实际上有时候查找很烦,避免错误的最好方式还是使用图形界面来配置.
如果修改如下:
40X =
(DESCRIPTION =
_(ADDRESS_LIST =
_(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.40)(PORT = 1521))
_)
_(CONNECT_DATA =
__(SERVER = DEDICATED)
__(SERVICE_NAME = test.com)
_)
)
tnsping 40X =>正常!
sqlplus scott/xxxx@40x =>连接也正常.
但是使用net manager配置还是无法打开配置界面.
改成这样
40X =
_(DESCRIPTION =
_(ADDRESS_LIST =
_(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.40)(PORT = 1521))
_)
_(CONNECT_DATA =
__(SERVER = DEDICATED)
__(SERVICE_NAME = test.com)
_)
)
使用net manager配置界面正常.当然如果你不想别人通过net manager 访问tnsnames.ora文件,就这样改,自己不要忘记就可以了.
总之,不是特殊需要建议还是使用图形界面来编辑.
BTW:我的client端是11.1.0.7.0,32位的.