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