下面介紹一個工作中遇到的案例場景,應用服務器連接數據庫出現”ORA-12154: TNS: 無法解析指定的連接標識符“。一般情況下ORA-12541錯誤是很容易排除的,但是這次遇到案例場景跟以往有所不同,我先模擬這樣一個環境,然後一一道來。
應用服務器安裝的ORACLE 11g客戶端,tnsname裡面的有如下配置,我們要通過它連接到目標服務器
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xxx.xxxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xxxx)
)
)
此時連接數據庫時,就會報ORA-12154: TNS: 無法解析指定的連接標識符。仔細檢查過tnsname裡面的配置,沒有任何問題。
C:\Users>sqlplus test/test@TEST
SQL*Plus: Release 11.2.0.1.0 Production on 星期一 5月 16 14:00:04 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS: 無法解析指定的連接標識符
請輸入用戶名:
接下來嘗試一下tnsping是否正常,發現其報TNS-03505: Failed to resolve name。 兩個服務器直接的網絡是正常的。telnet 檢測1521端口也是正常的。
C:\Users>tnsping TEST
TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 16-5月 -
2016 14:20:44
Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的參數文件:
C:\OracleClient\Oracle32\product\11.2.0\client_1\network\admin\sqlnet.ora
TNS-03505: 無法解析名稱
是否很納悶,那麼環境變量是否正常呢? 在David的這篇博客ORA-12154 和 TNS-03505 監聽錯誤的解決方法裡面有介紹。echo %path% 查看環境變量都OK,而且也能使用sqlplus連接到其它數據庫(後面述說),說明應用服務器的客戶端環境是正常的。那麼為什麼會出現這樣的詭異的問題呢?其實是因為在客戶端的sqlnet.ora配置文件裡面,添加了一行"NAMES.DEFAULT_DOMAIN = db.test.com", 如下所示,
解決方法有兩種:
1:修改tnsname.ora裡面的配置信息,改為下面即可解決這個問題。此時使用TEST.db.test.com 或TEST都可以連接到數據庫。
2:修改sqlnet.ora配置文件,刪除這一行"NAMES.DEFAULT_DOMAIN = db.test.com"。
TEST.db.test.com =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xxx.xxxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xxxx)
)
)
關於NAMES.DEFAULT_DOMAIN 請參考下面官方文檔介紹。
Purpose
To set the domain from which the client most often looks up names resolution requests.
Usage Notes
When this parameter is set, the default domain name is automatically appended to any unqualified net service name or service name.
For example, if the default domain is set to us.example.com
, then the connect string CONNECT scott@sales
gets searched as sales.us.example.com
. If the connect string includes the domain extension, such as CONNECT [email protected]
, then the domain is not appended to the string.
Default
None
Example
NAMES.DEFAULT_DOMAIN=example.com