我有一组shell脚本和sqlplus命令。
它们连接到甲骨文DB_ONE和DB_TWO。
我正在升级DB_ONE。
为了进行测试,我在本地DB_ONE中重写了tnsnames.ora条目。存在一个具有所有连接的全局tnsnames.ora。
export TNS_ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnames
这样,我就可以像预期的那样连接到DB_ONE on my_new.server和DB_TWO on some.other.server。
但是,如果我破坏了my_new.server,sqlplus就会自动连接到original.server上的DB_ONE。因此,它无声地失败,并失败到全局tnsname文件中的连接。我希望这种联系完全失败。
是否有一种“硬”覆盖的方法,使sqlplus只尝试本地tnsnames.ora的tnsnames.ora连接,而自由地尝试来自所有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)
)
)发布于 2015-09-16 12:26:48
这是无效的:
export TNS_ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnamesTNS_ADMIN 是一个单一目录路径。,而不是$PATH或$LD_LIBRARY_PATH等可搜索的列表。文档中提到:
如果没有设置TNS_ADMIN环境变量,那么Oracle将检查ORACLE_HOME/network/admin目录。
它没有这么说,但是如果TNS_ADMIN变量没有指向一个有效的目录,并且您的冒号分隔的列表不是有效的目录路径,它也会使用$ORACLE_HOME/network/admin下的tnsnames.ora来检查网络/管理目录。
这意味着您的本地“重写”文件永远不会被使用,并且您正在访问全局文件中指向的实例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,在Linux上,您可以跳过TNS_ADMIN环境变量,并使用~/.tnsnames.ora作为本地副本。
正如您所提到的,这不会反映对全局文件所做的任何更改,但假设您已经完成测试,您就可以破坏本地文件或恢复到全局TNS_ADMIN。
https://stackoverflow.com/questions/32588901
复制相似问题