Oracle 11g下TNS連線報錯ora-12532故障解決

dbasdk發表於2015-06-24

 

TNS連線錯誤是Oracle使用者經常遇到的問題。在實際工作中,由於使用者終端環境的複雜,各種TNS連線問題經常困擾日常使用者。作業系統版本問題、客戶端伺服器雙重安裝、多版本客戶端安裝、本地環境變數配置是我們經常遇到的故障場景和原因。

本篇記錄一個TNS Bug引發問題的解決,記錄下來,供有需要的朋友不時之需。

 

1、問題說明

 

問題是一個同事在配置連線到資料庫時候,總是報錯不能連線。筆者使用tnsping繼續測試,發現客戶端不能正確解析連線名稱。

這種問題出現的最大可能,就是tnsnames.ora檔案中配置格式出現問題。Oracle Net網路協議中,listener.oratnsnames.orasqlnet.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.6Oracle 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是官方提供的連線策略,很多朋友在配置過程中存在各種各樣的問題。在實際中,不要被問題表象所迷惑,抽絲剝繭、逐步深入可以幫助我們正確的解決問題。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1710661/,如需轉載,請註明出處,否則將追究法律責任。

相關文章