Oracle 11g下TNS串連報錯ORA-12532故障解決

來源:互聯網
上載者:User

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是官方提供的串連策略,很多朋友在配置過程中存在各種各樣的問題。在實際中,不要被問題表象所迷惑,抽絲剝繭、逐步深入可以協助我們正確的解決問題。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.