Oracle11g tnsnames.ora中的硬覆盖条目

Oracle11g tnsnames.ora中的硬覆盖条目,oracle11g,sqlplus,tnsnames,Oracle11g,Sqlplus,Tnsnames,我有一组shell脚本和sqlplus命令 这些连接到Oracle DB_ONE和DB_TWO 我正在升级DB_ONE 对于我的测试,我覆盖了本地tnsnames.ora中的DB_ONE条目。 存在一个全局tnsnames.ora,其中包含所有连接 export TNS\u ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnames 这样,我就可以按预期连接到我的新服务器上的DB_ONE和其他服务器上的DB_TWO 但是,如果我中断了我的\u n

我有一组shell脚本和sqlplus命令

这些连接到Oracle DB_ONE和DB_TWO

我正在升级DB_ONE

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

export TNS\u ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnames

这样,我就可以按预期连接到我的新服务器上的DB_ONE和其他服务器上的DB_TWO

但是,如果我中断了我的\u new.server,sqlplus会自动连接到original.server上的DB\u ONE。因此,它以静默方式失败,并故障转移到全局tnsnames文件中的连接。我希望这个连接完全失败

有没有一种方法可以实现“硬”覆盖,使得sqlplus只能从本地tnsnames.ora尝试一个DB_-ONE连接,而可以从所有tnsnames.ora文件自由尝试DB_-TWO连接

我的本地特纳姆斯诺拉酒店

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,不是可搜索列表,如
$PATH
$LD_LIBRARY_PATH
等。文档中提到:

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

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

这意味着您的本地“覆盖”文件从未被使用过,并且您正在访问全局文件中的哪个实例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_管理员。

您是如何“破坏”my_new.server的?哪种平台可以让您为TNS_ADMIN分隔两条路径?我以前从未见过这种情况?您如何从脚本进行连接?您试图避免更改
@DB\u ONE
引用?我不知道为什么您不能创建本地tnsnames.ora作为全局tnsnames.ora的完整副本,只需修改所需的条目,然后将TNS_ADMIN设置为仅指向本地编辑的版本。要中断my_new.server,请假设我停止数据库。TNS_ADMIN的行为与任何其他unix类路径变量类似,因此sqlplus会查看第一个可用的tnsname文件,如果第一个文件不有用,则查看第二个。这在运行bash的linux上对我有用。所有连接都是通过服务名称完成的,是的,我希望能够在不更改DB_ONE引用的情况下进行升级。是的,我可以复制全局文件,但是我必须维护它。对我来说,包含一台服务器的“补丁”的本地文件更易于维护。我不相信,它是单一路径。如果将其设置为无效值(就像用冒号分隔的两个实际路径一样),它将默认为
$ORACLE\u HOME/network/admin
。我怀疑您一直都在使用默认(全局?)文件条目,并且从未在my_new.server上点击过该实例-您如何验证您实际连接到的实例?是的,您是对的!刚刚尝试使用无效的TNS_ADMIN,两个tnsnames文件都指向损坏的数据库,但它仍然连接。因此,正如您所指出的,它正在查看默认值。谢谢-看起来似乎要复制全局文件。在Unix上,您还可以使用本地用户文件
~/.tnsnames.ora
。注意文件名中的前导点