客戶端連線故障檢查流程手段

realkid4發表於2011-12-22

 

最近幫同事解決了幾個TNS連線故障,覺得很有代表性。所以打算把一幫常用的處理思路記錄下來,權當記錄。

 

每個Oracle的學習者在安裝完資料庫、客戶端之後,對伺服器、例項、監聽器、本地服務名和服務名Service Name這些概念不容易弄清楚。在Windows下,經常出現連線失敗的問題。

 

這些困惑筆者也都經歷過,也曾經無下手之處。其實,處理這樣的問題思路,就是:從客戶端開始,一個環節一個環節進行檢驗。發現故障點,排除故障點。

 

下面,我們分別進行檢視。

 

1、安裝一個的客戶端

 

客戶端安裝和配置故障,是我們遇到連線故障中最大的比例。經常是我們自己配置和安裝客戶端程式有問題,引起的連線故障。

 

在企業或者專案組開發環境下,我們是沒有必要在自己機器上專門安裝資料庫伺服器的。一般,我們只需要安裝一個客戶端就可以了。

 

Oracle官方網站上,我們是可以免費下載到Oracle客戶端程式。目前,客戶端提供的是11g。通常客戶端是向下相容,也就是高版本的客戶端可以連線到低版本伺服器上。不過,筆者在實際使用中,發現低版本客戶端連線高版本伺服器通常也沒有什麼大問題。

 

這裡,我們要注意一個問題:Oracle伺服器上,實際也是預設安裝了客戶端核心元件的。如果你的機器上已經有資料庫伺服器,就不要在機器上額外安裝一個客戶端了。

 

當一臺機器上有多個伺服器或者客戶端的時候,配置和相關的內容是很多的。我們呼叫哪一個客戶端,使用哪個連線配置檔案,都是透過系統的環境變數,如ORACLE_HOMEORACLE_BASEPATH等內容進行定位的。而其中的關係,是初學者需要投入精力去理解的。很多朋友在呼叫sqlplus或者netca的時候,可能沒有意識到自己呼叫的究竟是哪個客戶端。

 

同時,多個客戶端並存,很多時候會引起衝突。筆者的一個朋友就遇到過機器上同時存在9i10g客戶端。PATH環境變數中包括了兩個客戶端的bin目錄,結果啟動sqlplus不成功,但是啟動sqlplusw卻成功。

 

出現這種問題,單純透過Oracle客戶端程式檢測是不容易解決的。只能一點點的分析和抽絲剝繭。所以,為了避免不必要的麻煩,如果我們沒有把握進行除錯,還是保留一份客戶端就好。

 

2、安裝作業系統位數合適的客戶端

 

這個故障筆者在工作中和QQ群裡面都遇到過。現在個人PC容量驚人,超4G記憶體比比皆是。於是乎個人客戶端上64位作業系統也就不是什麼新鮮事。

 

經常有朋友問這樣的問題:我的64OS上面,安裝了64位的Oracle Client。配置本地命名都是沒有問題,使用SQLPLUS連線沒有問題。但是安裝上pl/sql developer之後,就連線不上,報錯資訊有時候還看不清楚。

 

其實,這個問題還是作業系統位數相容的問題。Windows環境下,64位作業系統是相容32位的程式的。在64位機器上安裝64Oracle Client是沒有問題的。但是,問題出在pl/sql developer上。目前我們常用的pl/sql developer都是32位版本的,其工作原理是需要呼叫Oracle客戶端的OCI介面檔案。這個檔案pl/sql developer也需要32位的。所以,才出現客戶端連線沒問題,而pl/sql developer連線有問題的情況。

 

解決的方法也容易,就是安裝32位的客戶端。

 

3、客戶端命名配置

 

客戶端本地命名是另一個出現問題的方面,同時也是解決問題的一個入手點。

 

 

C:\Documents and Settings\Administrator>sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 12 22 21:10:51 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn scott/tiger@ora11g;

ERROR:

ORA-12170: TNS: 連線超時

 

 

首先,需要判斷連線的本地命名ora11g是否解析成功。這裡可以使用tnsping命令進行檢查。TNSPING命令是Oracle提供的網路ping命令。

 

 

 

C:\Documents and Settings\Administrator>tnsping ora11g

 

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 22-12-

2011 21:17:16

 

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

 

已使用的引數檔案:

D:\oracle\network\admin\sqlnet.ora

 

已使用 TNSNAMES 介面卡來解析別名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = 192.168.0.89)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

TNS-12535: TNS: 操作超時

 

 

TNSPING命令的結果有三個重要意義:

 

ü        判斷當前使用的TNS配置檔案位置。

 

 

已使用的引數檔案:

D:\oracle\network\admin\sqlnet.ora

 

 

這部分內容很有意義。當客戶端所在OS上安裝多個客戶端時候,我們可以從這裡判斷出使用的TNS究竟是哪個。同時,雖然提示的sqlnet.ora,但是重要的tnsnames.ora檔案是和它在相同的目錄下的。

 

如果這部分有問題,比如定位的客戶端不是希望的。那麼就請檢查環境變數,特別是path變數的配置。

 

ü        本地命名解析

 

 

已使用 TNSNAMES 介面卡來解析別名

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = 192.168.0.89)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora11g)))

 

 

第二部分有益的資訊是關於命名的解析。我們在tnsnames.ora中配置了本地命名。但是,有時候這些資訊名稱是不會正確解析的,如使用粘帖方法、關鍵字書寫等。這部分,可以讓我們知道Oracle Net Service元件是如何解析ora11g的。其中的IP地址,服務名,埠等內容是否正確?是我們檢查的專案。

 

如果這部分不能解析,或者解析有誤。建議去檢查或者重新生成一些tnsnames.ora檔案。

 

ü        遠端監聽器情況

 

最後,tnsping會去檢查一下遠端伺服器上的監聽器狀態。如果發現指定埠沒有監聽程式守候,就會提示錯誤。那麼,我們起碼知道監聽器配置上存在一些問題。

 

當客戶端配置沒有問題的時候,我們就需要考慮一下是否是伺服器的問題了。下面,我們討論一下簡單的伺服器端問題。

 

4、監聽器故障

 

監聽器是Oracle伺服器的一個重要元件。監聽器主要職責就是為例項和client建立請求連線。

 

這個環節我們就需要使用lsnrctl控制元件。

 

 

[oracle@oracle11g ~]$ lsnrctl

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 19-DEC-2011 22:25:39

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

 

LSNRCTL>

 

 

首先,我們需要檢查一下監聽器狀態。

 

 

LSNRCTL> status 

Connecting to (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=oracle11g) (PORT=1521)))

TNS-12541: TNS:no listener

 TNS-12560: TNS:protocol adapter error

  TNS-00511: No listener

   Linux Error: 111: Connection refused

 

 

裡面的連線資訊首先說明了監聽器程式的配置資訊,包括埠號。顯然,這個監聽器沒有啟動。需要啟動之後才可能接受到遠端的請求。

 

 

LSNRCTL> start

Starting /u01/oracle/bin/tnslsnr: please wait...

 

TNSLSNR for Linux: Version 11.2.0.1.0 - Production

System parameter file is /u01/oracle/network/admin/listener.ora

Log messages written to /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                19-DEC-2011 22:27:23

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/oracle/network/admin/listener.ora

Listener Log File         /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))

The listener supports no services

The command completed successfully

 

 

注意,此時雖然監聽器啟動,但是並沒有服務註冊進監聽器。也就是說,監聽器並不知道註冊的服務名稱Service Name是什麼,更不要說對應例項Instance的資訊了。

 

這裡,就牽扯到例項的啟動和動靜態註冊問題了。

 

5、資料庫例項的動靜態註冊

 

監聽器啟動之後,下面確認的環節就是例項是否啟動了。這個過程我們需要登入到資料庫伺服器所在主機,進行確認和啟動。

 

 

[oracle@oracle11g ~]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 19 22:30:20 2011

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected to an idle instance.

 

 

顯然,上面的資料庫是沒有啟動。

 

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  414298112 bytes

Fixed Size                  1336904 bytes

Variable Size             327158200 bytes

Database Buffers           79691776 bytes

Redo Buffers                6111232 bytes

Database mounted.

Database opened.

 

 

註冊過程就是資料庫例項要讓監聽器知道自己的目錄位置和服務名稱Service Name。註冊過程有動態註冊和靜態註冊兩種型別,現在最常用的就是動態註冊。

 

所謂動態註冊,就是例項的pmon程式每隔一段時間,就自動訪問一次監聽器程式,告知自己狀態。動態註冊的意義有兩個,一個是讓監聽程式可以獲取到服務資訊,另一個更加有意義的方面是讓監聽器可以知道例項的健康狀態,便於進行failover

 

我們啟動例項之後,就可以查到註冊狀態了。

 

 

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))

Services Summary...

Service "wilson" has 1 instance(s).

  Instance "wilson", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

如果我們發現例項啟動之後,沒有發生主動的動態註冊。可以手工的呼叫語句強制進行註冊。

 

 

SQL> alter system register;

System altered.

 

 

 

 

6、結論

 

TNS NameOracle Net Service是初學Oracle畢竟的一個關口。筆者從最常出問題的環節出發,介紹了檢測方法,便需要的朋友共享。

 

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

相關文章