最近部署項目,Linux系統使用非Oracle使用者測試(比如test)tnsping orcl出現如下提示資訊:
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 04-DEC-2012 14:29:28
Copyright (c) 1997, 2009, Oracle. All rights reserved.
Used parameter files:
/opt/oracle/product/11g/network/admin/sqlnet.ora
TNS-03505: Failed to resolve name
乍一看,問題出現原因清楚明了。就是orcl服務名無法解析。但是我在本區域網路使用其它windows系統中的pl/sql可以串連。
因為對Linux系統認知甚少,所以一頭霧水。去網搜一下很多,大約有這麼幾種解決方案:
一是檔案配置錯誤;
二是sqlnet.ora檔案中NAMES.DIRECTORY_PATH設定問題;
三是lsnrctl status 監聽錯誤或者sqlplus版本問題。
第一種情況意思就是說在tnsnames.ora這個檔案中我配置的orcl有問題,大部人說前面不能有空格,我的本來就沒有;再就是listener.ora有一個標準的寫法,如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /oracle/product/10.2.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
第二種情況說的是通過用戶端訪問資料庫伺服器順序。我也是從這個文章發現我的問題的,我的linux使用者test沒有訪問tnsname.ora這個檔案的許可權。
第三種情況說的是監聽服務沒起來。這個很容易就能查別,使用lsnrctl status即可知道。
通過解決這麼一個問題,我總結一下思路:
首先:查詢監聽狀態。因為我的可以通過其它用戶端訪問,所以不會是監聽的問題。
其次:使用oracle使用者,測試tnsping orcl。一般情況下肯定通。非oracle使用者並且不屬於oracle使用者所屬組的查看是否有許可權。沒有許可權使用: chmod o+r tnsname.ora即可。
最後:版本相容性的問題。