Oracle 11g下TNS串連報錯ORA-12532故障解決
TNS串連錯誤是Oracle使用者經常遇到的問題。在實際工作中,由於使用者終端環境的複雜,各種TNS串連問題經常困擾日常使用者。作業系統版本問題、用戶端伺服器雙重安裝、多版本用戶端安裝、本地環境變數配置是我們經常遇到的故障情境和原因。
本篇記錄一個TNS Bug引發問題的解決,記錄下來,供有需要的朋友不時之需。
1、問題說明
問題是一個同事在配置串連到資料庫時候,總是報錯不能串連。筆者使用tnsping繼續測試,發現用戶端不能正確解析串連名稱。
這種問題出現的最大可能,就是tnsnames.ora檔案中配置格式出現問題。Oracle Net網路通訊協定中,listener.ora、tnsnames.ora和sqlnet.ora是三個核心設定檔。三個檔案保持著文本規格配置方法,是比較簡單、但也容易出錯的設定檔。
果然在tnsnames.ora檔案中,我們發現了配置片段。
testDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.xx.xx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)
這種格式顯然是同事從其他地方黏貼過來的。在之前的部落格文章中,我們討論過tnsnames.ora中格式的解析規則,具體如下:
ü 本地Net名稱必須頂行頭書寫,不能出現空格;
ü 配置資訊括弧中,只有最外層括弧允許頂行頭書寫,其他括弧不允許。注意:如果最外層括弧頂行頭書寫,雖然tnsping和串連可以識別串連,但是netca組態工具不能識別,會出現組態工具hang住的情況;
根據這個思路,進行格式整理,形成如下格式:
testDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.xx.xx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)
之後,使用tnsping進行測試。
C:\Users\Thinkpad>tnsping testdb
TNS Ping Utility for 32-bit Windows: Version 11.1.0.6.0 - Production on 01-6月 -
2015 14:12:27
Copyright (c) 1997, 2007, Oracle. All rights reserved.
已使用的參數檔案:
F:\app\xxx\product\11.1.0\db_1\network\admin\sqlnet.ora
已使用 TNSNAMES 適配器來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 172.16.xx.xx)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = testdb)))
TNS-12532: TNS: 無效的參數
這個就有超出筆者經驗的情況了。從tnsping的情況看,Oracle Net是可以正確解析出連結字串。而且配置參數類型都是比較常見的類型,沒有出現錯誤的機率。
最詭異的是錯誤提示:無效的參數。讓人一時摸不到頭腦。
無奈之下,筆者嘗試刪除掉串連內容,重新執行netca配置一個相同的串連。但是在最後測試的環節,出現相同提示錯誤:
正在串連...ORA-12532: TNS: 無效的參數
測試未成功。
您提供的一些資訊可能不正確。
單擊“後退”檢查提供的 Net 服務名的資訊, 或單擊“更改登入”來更改使用者名稱。
比較詭異的問題了。
2、問題分析與解決
資料庫伺服器、監聽程式肯定是正常的,其他使用者串連沒有問題。問題根源依然是在用戶端沒錯。根據經驗:首先詳細檢查一下同事本地機器的配置和軟體情況。
首先,發現同事安裝的不是用戶端程式,而是Oracle 11gR1版本伺服器。
C:\Users\Thinkpad>tnsping sicsdb
TNS Ping Utility for 32-bit Windows: Version 11.1.0.6.0 - Production on 01-6月 -
2015 14:12:27
具體版本是11.1.0.6,此外同事64位伺服器上安裝了32位元據庫軟體。根據經驗,Oracle任何一個大版本發布,不到release 2的時候,是可能有很多潛在Bug出現的。另外,雖然在Windows環境下,64位作業系統可以相容32位軟體程式,但是很多底層調用是會出現問題的,更容易引起bug的出現。
按照這個思路,筆者在官方MOS網站上找到對應的文章資訊:11g: TNS-12532 / ORA-12532 Reported When Firewall Is Enabled (文檔 ID 748466.1)。
在文章中,說明在11.1.0.6的Oracle Net Services中,可能會出現ora 12532錯誤。標準的該錯誤提示內容為:
[oracle@SICS-MIGPC-DB ~]$ oerr ora 12532
12532, 00000, "TNS:invalid argument"
// *Cause: An internal function received an invalid parameter.
// *Action: Not normally visible to the user. For further details, turn
// on tracing and reexecute the operation. If error persists, contact
// Oracle Customer Support.
這是一個很內部的錯誤,一般不會被普通使用者看到。主要原因在於從用戶端向外發送資訊的時候,被防火牆或者其他原因阻塞。
這個問題已經被Oracle內部識別為一個bug,編號是6031201。出現12532錯誤的提示資訊顯然是不正確的,應該對應TNS:connection refused資訊。
聯絡同事修改該問題,將原生防火牆關閉,重新實驗,串連成功。
C:\Users\Thinkpad>tnsping testdb
TNS Ping Utility for 32-bit Windows: Version 11.1.0.6.0 - Production on 01-6月 -
2015 14:39:54
Copyright (c) 1997, 2007, Oracle. All rights reserved.
已使用的參數檔案:
F:\app\xxxx\product\11.1.0\db_1\network\admin\sqlnet.ora
已使用 TNSNAMES 適配器來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 172.16.xx.xx)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = testdb)))
OK (10 毫秒)
故障消失。建議同事卸載低版本Oracle,安裝11.2.0.4系列用戶端。
3、結論
Oracle Net是官方提供的串連策略,很多朋友在配置過程中存在各種各樣的問題。在實際中,不要被問題表象所迷惑,抽絲剝繭、逐步深入可以協助我們正確的解決問題。