tnsnames.ora中的硬覆盖条目

时间:2015-09-15 14:37:39

标签: oracle11g sqlplus tnsnames

我有一组shell脚本和sqlplus命令。

这些连接到Oracle DB_ONE和DB_TWO。

我正在升级DB_ONE。

对于我的测试,我覆盖了本地tnsnames.ora中的DB_ONE条目。 存在一个包含所有连接的全局tnsnames.ora。

export TNS_ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnames

这样,我可以按照预期连接到my_new.server上的DB_ONE和some.other.server上的DB_TWO。

但是,如果我中断my_new.server,sqlplus会自动连接到original.server上的DB_ONE。因此它无声地失败并故障转移到全局tnsnames文件中的连接。我希望这种连接完全失败。

有没有办法让人难以接受?覆盖,以便sqlplus只尝试从本地tnsnames.ora连接DB_ONE,同时可以自由尝试所有tnsnames.ora文件的DB_TWO连接?

我的本​​地tnsnames.ora

DB_ONE=
        (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS=
                        (PROTOCOL=TCP)
                        (PORT=1524)
                        (HOST=my_new.server)
                )
        )
        (CONNECT_DATA=
                (SERVICE_NAME=DB_ONE)
        )
        )

我无法改变的全球tnsnames.ora

DB_ONE=
        (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS=
                        (PROTOCOL=TCP)
                        (PORT=1524)
                        (HOST=original.server)
                )
        )
        (CONNECT_DATA=
                (SERVICE_NAME=DB_ONE)
        )
        )

DB_TWO=
        (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS=
                        (PROTOCOL=TCP)
                        (PORT=1524)
                        (HOST=some.other.server)
                )
        )
        (CONNECT_DATA=
                (SERVICE_NAME=DB_TWO)
        )
        )

1 个答案:

答案 0 :(得分:2)

这是无效的:

export TNS_ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnames

TNS_ADMIN is a single directory path,不是$PATH$LD_LIBRARY_PATH等可搜索列表。文档提到:

  

如果未设置TNS_ADMIN环境变量,则Oracle Net将检查ORACLE_HOME / network / admin目录。

它没有这么说,但如果TNS_ADMIN变量没有指向有效目录,并且冒号分隔列表不是有效的目录路径,它也默认检查network / admin目录,它将使用tnsnames.ora下的$ORACLE_HOME/network/admin

这意味着您的本地'覆盖'永远不会使用文件,并且您正在访问全局文件中DB_ONE指向的实例。如果第一个文件失败的话,那就不是第二个文件中的TNS条目被使用 - 这个机制就不存在了。 (您可以在文件中进行故障转移,但情况有所不同)。

假设你有使用像user/pwd@DB_ONE这样的TNS别名的连接字符串而你无法改变测试的连接字符串,你唯一真正的选择就是制作全局文件的完整副本并编辑条目对于DB_ONE:

cp /path/to/global/tnsnames/tnsnames.ora /path/to/local/tnsnames/
edit /path/to/local/tnsnames/tnsnames.ora
export TNS_ADMIN=/path/to/local/tnsnames

或者正如评论中提到的@ ibre5041一样,您可以跳过TNS_ADMIN环境变量并使用~/.tnsnames.ora作为本地副本。

正如您所提到的,它不会反映对全局文件所做的任何更改,但可能在您完成测试后,您可以删除本地文件或者还原为全局TNS_ADMIN。