下面介紹一個工作中遇到的案例場景,應用服務器連接數據庫出現”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 請參考下面官方文檔介紹。
NAMES.DEFAULT_DOMAIN
To set the domain from which the client most often looks up names resolution requests.
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 scott@sales.us.example.com
, then the domain is not appended to the string.
None
NAMES.DEFAULT_DOMAIN=example.com