【问题标题】:sqlplus through SSH failed to resolve tns通过 SSH 的 sqlplus 无法解析 tns
【发布时间】:2018-08-17 13:37:45
【问题描述】:

我设置了一个 EC2 实例和 RDS 实例。然后在 EC2 实例上安装 oracle 实例客户端。之后,我设法执行 sqlplus 并从 EC2 实例连接数据库。为此,我创建了一个 tnsnames.ora 文件并输入数据库的服务详细信息。

我可以,

sqlplus user/password@db_alias

但我做不到,(这给出了 ERROR: ORA-12154: TNS:could not resolve the connect identifier specified)

ssh username@ip sqlplus user/password@db_alias

还配置了无密码 ssh。我正在对当前机器本身进行 ssh。任何想法都会有所帮助。

补充细节。由于我安装了 oracle 实例客户端,因此 tnsping 命令不可用。我通过在 .profile 文件中添加以下函数来实现这一点。

whence tnsping >/dev/null 2>&1 ||
  tnsping() {
    sqlplus -L -s x/x@$1 </dev/null |
      grep ORA- |
        (grep -v ORA-01017 || echo OK)
  }

【问题讨论】:

  • 你在哪里创建了tnsnames.ora?当您像这样 ssh 时,您的环境可能缺少指向其位置的 $TNS_ADMIN 变量,尽管它似乎已经具有 $PATH 和其他 Oracle 变量。
  • @AlexPoole 我将 tnsnames.ora 放在 $ORACLE_HOME/network/admin 中。还将 $TNS_ADMIN 设置为上述路径。有时可能是 tnsnames.ora 的权限问题。我会检查的。
  • 但是你如何设置TNS_ADMIN - 在你调用ssh之前在你的shell中手动设置?或者在环境文件(.bashrc、.prifle 等)中,以便被运行 sqlplus 的新会话拾取?
  • 我将它添加到环境文件中。所以我希望它适用于每个会话。对上一条评论的补充。 tnsnames.ora 文件具有所需的权限级别。
  • @AlexPooleYup!该变量在通过 ssh 执行 sqlplus 时不可用。我的操作系统是 ubuntu。所以.profile 有一个到源.bashrc 的条目,.bashrc 有这些记录。我想不出不设置环境变量的原因。

标签: oracle amazon-ec2 sqlplus amazon-rds tnsping


【解决方案1】:

这个问题可以缩小到加载环境变量的问题(特别是$TNS_ADMIN)。由于.bashrc 具有验证登录shell 是交互式还是非交互式的验证,因此未加载底部定义的变量。

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

tns 不能通过 ssh 解决的原因是 $TNS_ADMIN 变量不可用。通过在 .bashrc 的开头定义变量,我可以解决这个问题。

另见Why does an SSH remote command get fewer environment variables then when run manually?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多