From the documentation,ORA_12546是:
ORA-12546:TNS:许可被拒绝
原因:用户没有足够的权限来执行所请求的操作。 操作:获得必要的权限并重试。
这是完全没有任何帮助,但各种论坛和博客(太多的链接,谷歌搜索的错误显示了很多类似的意见)提上安装,$ORACLE_HOME/bin/oracle
的特定部分的权限,这是大多数服务的关键和核心部分。
通常在该文件的权限将-rws-r-s--x
,与oracle:dba
拥有的文件,并在字写的标志,可能会发生这个错误 - 在这种模式最终x
- 未设置。 dba
群组中的任何人都仍然可以执行此操作,但外面的人不会。
您的监听器似乎很好,因为您可以通过在连接字符串中指定@dbname
进行远程连接。侦听程序的运行方式为oracle
(通常,可能为带有HA,RAC或ASM的grid
),因此它位于dba
组中,并且可以愉快地将连接切换到oracle
可执行文件的实例。
当您不通过侦听器连接时,您必须能够自己执行该文件。看来root
不能执行它(或者可能是其他文件,但通常这是罪魁祸首,显然),这意味着世界可写位实际上没有设置。
至于我可以看到你有三种选择:
- 集世界可写位,与
chmod o+x $ORACLE_HOME/bin/oracle
;但是这为每个人开放了权限,并且可能他们因为某种原因受到了限制;
- 将
root
加到dba
组,通过usermod
或/etc/group
;这也可能削弱安全性;
- 即使未在连接字符串中指定
@dbname
,也可以通过在root
环境中添加export TWO_TASK=dbname
来使用SQL * Net。
你说你在另一台服务器上没有这个问题,而且文件权限是一样的;在这种情况下,root
可能位于该框上的dba
组中。但我认为第三种选择似乎是最简单和最安全的。我想还有第四个选项,要安装一个单独的instant client,但是你必须设置TWO_TASK
,并且通过SQL * Net,并且你已经排除了这一点。
我不会纠缠于它是否运行为root
sqlplus
(需要它或者实际上的应用程序)是一个好主意,但是会提到,你可能有一个脚本或函数调用sqlplus
切换到一个通过su
运行真实可执行文件的特权较低的帐户,并且可能对应用程序透明。除非您切换到oracle
帐户,但这也不是一个好主意,您将拥有相同的权限问题和选项。
你还没有说过你试过的东西,所以这可能会重复。据推测,你有环境变量('ORACLE_HOME','TNS_ADMIN','ORACLE_SID' ...)设置正确,或者我认为你会看到不同的错误。您是否正在使用完整的Oracle安装,并且在您的'ORACLE_HOME'中有没有什么奇怪的权限?我建议你有一个单独安装的“root”即时客户端用于保持尽可能多的分离 - 这是可行的吗? –
我拥有与oracle用户完全相同的环境变量。是的,它是一个标准的Oracle Oracle安装。我检查了另一台按预期运行的服务器的权限和所有权,但找不到差异,所以我怀疑它与某个配置有关。不幸的是,在这种情况下不可能为root安装一个单独的客户端。我觉得这是监听器配置的问题,远远超过数据库。感谢您的调查,迄今。 – PierreVn
是的,我只是启动sqlplus并依靠ORACLE_SID。我没有配置任何钱包,也许有默认配置?运行正常的系统使用Oracle 11.1.0.6,而不是使用11.2.0.1。 TWO_TASK未在任一系统上设置。在两个系统上找不到任何差别。我还没有告诉它,但从用户root,'tnsping dbname'正确答案!我很困惑! – PierreVn