Avindra Goolcharan Asked: 2015-01-30 11:27:21 +0800 CST2015-01-30 11:27:21 +0800 CST 2015-01-30 11:27:21 +0800 CST 生成 tnsnames.ora 条目的最佳实践 772 我需要集成一些从 Oracle 数据库导出和导入数据的脚本。它们是依赖于正在设置的 TNS 名称的 shell 脚本(例如,scott/tiger@tns)。 应用程序所有者可能不会更改脚本以支持 EZConnect 语法,因此我现在最好的选择是自动化 TNS 名称设置。该文件供参考,位于此处: $ORACLE_HOME/network/admin/tnsnames.ora 这样做是否已经有最佳实践/现有实用程序?还是我只需要编写一个 shell 脚本来完成任务? oracle network 2 个回答 Voted Gandolf989 2015-01-31T05:42:45+08:002015-01-31T05:42:45+08:00 我没有使用 tnsnames,而是使用 openLDAP 来进行名称解析。如果需要,您可以跨两个节点进行复制。一旦您更改了 openLDAP 中的条目,每个服务器都会有新信息。如果需要,您甚至可以从 ssl 加密端口获得分辨率。 使用 openLDAP 名称解析 Best Answer Avindra Goolcharan 2015-02-25T13:01:27+08:002015-02-25T13:01:27+08:00 我通过从名为 $connString 的全局环境变量动态插入主机名/数据库名解决了这个问题。示例代码: tnsOverride() { index=0 for var in "$@" do index=$((index + 1)) if [[ $var =~ ^.+@.+$ ]]; then # connect string found var=`echo $var | sed -e "s#@.*#@${connString}#g"` set -- "${@:1:$((index - 1))}" ${var} "${@:$((index + 1))}" fi done echo "$@" } sqlplus() { set -- `tnsOverride "$@"` command sqlplus $@ } expdp() { set -- `tnsOverride "$@"` command expdp $@ } impdp() { set -- `tnsOverride "$@"` command impdp $@ } export -f tnsOverride sqlplus expdp impdp 从设置了这些函数的环境中调度的任何后续 shell 脚本都将即时覆盖参数。
我没有使用 tnsnames,而是使用 openLDAP 来进行名称解析。如果需要,您可以跨两个节点进行复制。一旦您更改了 openLDAP 中的条目,每个服务器都会有新信息。如果需要,您甚至可以从 ssl 加密端口获得分辨率。
使用 openLDAP 名称解析
我通过从名为 $connString 的全局环境变量动态插入主机名/数据库名解决了这个问题。示例代码:
从设置了这些函数的环境中调度的任何后续 shell 脚本都将即时覆盖参数。