談到ora-12154問題,網上有一大堆解決方案,原因基本統一:tns或listener配置不正確。對於listener配置不正確的一般較少發生,大多數人都是按照預設配置一路“下一步”過來的,基本都是orcl的服務名,如果說本地可以連通orcl,別的機子就連不通那應該跟listener關係不大。大部分都是tns配置不正確。我遇到的現象是:在本機建了一個2003的虛擬機器,虛擬機器裡面裝了oracle10g,預設配置。本機只裝了oracle10g的用戶端,當我以前用本機串連區域網路內資料庫的orcl服務(資料庫與區域網路內資料庫一樣)時沒有問題,但是在串連虛擬機器中的orcl服務卻連不通,總是報ora-12154錯誤。而虛擬機器內,plsql卻可以串連虛擬機器oracle,但是不能串連本機所在區域網路內的oracle。
按照如下過程,一般都能解決:
- 在虛擬機器內開cmd,用lsnrctl status查看監聽器監聽的服務
- 如看到監聽服務“orcl”,那在原生tns配置中(SERVICE_NAME = orcl)必須寫orcl;如果想要自訂,則在虛擬機器內的listener配置中就要加入自訂服務名,記得要重啟監聽服務:lsnrctl reload
- 最後形成的設定檔如下
虛擬機器listener:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = test) 自訂服務名
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1) db_home
(SID_NAME = test)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1) ##這個服務保證你可以使用外部過程,如C程式
)
)
本機tns:
ORCL_XNJ =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 182.12.15.232)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test) 與自訂服務名對應
)
)
再次串連,問題解決!
記住,一定從最簡單的原因找起,不要一上去就看到網上的什麼改process數、註冊表之類的,要想想本機能連為什麼通過網路就不行,還是定位問題。