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。
我有一组 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。