tnsnames.ora 中的硬覆盖条目

Hard override entry in tnsnames.ora

我有一组 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 文件中的连接。我希望此连接完全失败。

有没有办法让 'hard' 覆盖,这样 sqlplus 将只尝试来自本地 tnsnames.ora 的 DB_ONE 连接,同时可以自由尝试 DB_TWO来自所有 tnsnames.ora 个文件的连接?

我本地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)
        )
        )

这是无效的:

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

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

If the TNS_ADMIN environment variable is not set, then Oracle Net will check the ORACLE_HOME/network/admin directory.

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

下的 tnsnames.ora

这意味着您的本地 'override' 文件从未被使用,并且您正在访问全局文件中 DB_ONE 指向的实例。如果第一个文件失败,则不会使用第二个文件的 TNS 条目 - 该机制根本不存在。 (您可以在 文件中进行故障转移 ,但那是不同的)。

假设您有使用 TNS 别名(如 user/pwd@DB_ONE)的连接字符串,并且您无法为测试更改这些别名,那么您唯一真正的选择是制作全局文件的完整副本并仅编辑条目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 在评论中提到的那样,当您在 Linux 上时,您可以跳过 TNS_ADMIN 环境变量并使用 ~/.tnsnames.ora 作为您的本地副本。

正如您提到的那样,这不会反映对全局文件所做的任何更改,但大概一旦您完成了测试,您就可以丢弃本地文件或恢复到全局文件 TNS_ADMIN。