之前一直认为这是Oracle的一个bug,直到前一段时间通读网络服务参考手册时,才发现问题的真相。
TNSNAMES配置中空格导致的bug:http://yangtingkun.itpub.net/post/468/487506
当时测试发现,只要在SERVICE_NAME下面的一行缺少空格,就会导致错误的产生:
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) ) __) |
后来发现,却是这种情况会引发TNSNAMES.ORA解析错误,但是如果这里添加了空格,而在其他位置删除空格,会引发同样的问题。不过由于一直把这个现象当做了BUG,没有再进行深入的分析。
问题的答案在看文档的时候被揭晓。原来Oracle的TNSNAMES.ORA中对格式存在要求,换行的下一行如果和上一行存在父子关系,则不能顶头,至少要保留一个空格,来提示Oracle这不是一个新的配置,而是上面配置的继续。
根据文档的描述,对于子配置项,如果要单独一行,那么至少要在换行后保留一个空格,否则就应该与主配置同属一行。
本以为发现的是Oracle的一个bug,没想到却是文档中明确说明的特性,这就是文档没有看全就自以为是乱下判断的结果,引以为戒。