首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tnsnames.ora中的硬覆盖条目

tnsnames.ora中的硬覆盖条目
EN

Stack Overflow用户
提问于 2015-09-15 14:37:38
回答 1查看 2.2K关注 0票数 0

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

代码语言:javascript
复制
DB_ONE=
        (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS=
                        (PROTOCOL=TCP)
                        (PORT=1524)
                        (HOST=my_new.server)
                )
        )
        (CONNECT_DATA=
                (SERVICE_NAME=DB_ONE)
        )
        )

我无法改变的全局tnsnames.ora

代码语言:javascript
复制
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)
        )
        )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 12:26:48

这是无效的:

代码语言:javascript
复制
export TNS_ADMIN=/path/to/local/tnsnames:/path/to/global/tnsnames

TNS_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的条目:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32588901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档