首页 > 解决方案 > 通过 SSH 的 sqlplus 无法解析 tns

问题描述

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

我可以,

sqlplus user/password@db_alias

但我做不到,(这给出了错误:ORA-12154:TNS:无法解析指定的连接标识符)

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)
  }

标签: oracleamazon-ec2sqlplusamazon-rdstnsping

解决方案


这个问题可以缩小到加载环境变量的问题(特别是$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,我可以解决这个问题。

另请参阅为什么 SSH 远程命令在手动运行时获得的环境变量更少?


推荐阅读