客戶端連線故障檢查流程手段
最近幫同事解決了幾個TNS連線故障,覺得很有代表性。所以打算把一幫常用的處理思路記錄下來,權當記錄。
每個Oracle的學習者在安裝完資料庫、客戶端之後,對伺服器、例項、監聽器、本地服務名和服務名Service Name這些概念不容易弄清楚。在Windows下,經常出現連線失敗的問題。
這些困惑筆者也都經歷過,也曾經無下手之處。其實,處理這樣的問題思路,就是:從客戶端開始,一個環節一個環節進行檢驗。發現故障點,排除故障點。
下面,我們分別進行檢視。
1、安裝一個的客戶端
客戶端安裝和配置故障,是我們遇到連線故障中最大的比例。經常是我們自己配置和安裝客戶端程式有問題,引起的連線故障。
在企業或者專案組開發環境下,我們是沒有必要在自己機器上專門安裝資料庫伺服器的。一般,我們只需要安裝一個客戶端就可以了。
在Oracle官方網站上,我們是可以免費下載到Oracle客戶端程式。目前,客戶端提供的是11g。通常客戶端是向下相容,也就是高版本的客戶端可以連線到低版本伺服器上。不過,筆者在實際使用中,發現低版本客戶端連線高版本伺服器通常也沒有什麼大問題。
這裡,我們要注意一個問題:Oracle伺服器上,實際也是預設安裝了客戶端核心元件的。如果你的機器上已經有資料庫伺服器,就不要在機器上額外安裝一個客戶端了。
當一臺機器上有多個伺服器或者客戶端的時候,配置和相關的內容是很多的。我們呼叫哪一個客戶端,使用哪個連線配置檔案,都是透過系統的環境變數,如ORACLE_HOME、ORACLE_BASE和PATH等內容進行定位的。而其中的關係,是初學者需要投入精力去理解的。很多朋友在呼叫sqlplus或者netca的時候,可能沒有意識到自己呼叫的究竟是哪個客戶端。
同時,多個客戶端並存,很多時候會引起衝突。筆者的一個朋友就遇到過機器上同時存在9i和10g客戶端。PATH環境變數中包括了兩個客戶端的bin目錄,結果啟動sqlplus不成功,但是啟動sqlplusw卻成功。
出現這種問題,單純透過Oracle客戶端程式檢測是不容易解決的。只能一點點的分析和抽絲剝繭。所以,為了避免不必要的麻煩,如果我們沒有把握進行除錯,還是保留一份客戶端就好。
2、安裝作業系統位數合適的客戶端
這個故障筆者在工作中和QQ群裡面都遇到過。現在個人PC容量驚人,超4G記憶體比比皆是。於是乎個人客戶端上64位作業系統也就不是什麼新鮮事。
經常有朋友問這樣的問題:我的64位OS上面,安裝了64位的Oracle Client。配置本地命名都是沒有問題,使用SQLPLUS連線沒有問題。但是安裝上pl/sql developer之後,就連線不上,報錯資訊有時候還看不清楚。
其實,這個問題還是作業系統位數相容的問題。在Windows環境下,64位作業系統是相容32位的程式的。在64位機器上安裝64位Oracle 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 Name和Oracle Net Service是初學Oracle畢竟的一個關口。筆者從最常出問題的環節出發,介紹了檢測方法,便需要的朋友共享。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-713802/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 4.2.14 啟用客戶端快速連線故障轉移客戶端
- impala客戶端連線客戶端
- 4.2.14.1 關於啟用客戶端快速連線故障轉移客戶端
- 4.2.14.3 為Oracle呼叫介面客戶端啟用快速連線故障轉移Oracle客戶端
- Redis客戶端連線數DevOpsRedis客戶端dev
- mysql、redis 客戶端連線池MySqlRedis客戶端
- Java 客戶端 Jedis和JedisPool 連線池Java客戶端
- Oracle 19c中連線RMAN客戶端的連線方法Oracle客戶端
- 4.2.14.2 為JDBC客戶機啟用快速連線故障轉移JDBC
- Redis客戶端基本操作以及檢視慢查詢Redis客戶端
- 使用 WebSocket 客戶端連線 MQTT 伺服器Web客戶端MQQT伺服器
- 客戶端怎麼連線到伺服器?客戶端伺服器
- Presto學習筆記——Go客戶端連線PrestoREST筆記Go客戶端
- 使用 Java 客戶端透過 HTTPS 連線到 EasysearchJava客戶端HTTP
- HTTP客戶端連線,選擇HttpClient還是OkHttp?HTTP客戶端client
- gRPC學習記錄(六)--客戶端連線池RPC客戶端
- ESP作為單連線中的TCP客戶端TCP客戶端
- php連結nsq客戶端PHP客戶端
- OceanBase學習之路7|透過 MySQL 客戶端連線 OceanBase 租戶MySql客戶端
- 0039-如何使用PythonImpyla客戶端連線Hive和ImpalaPython客戶端Hive
- 微服務整合Spring Cloud Alibaba Seata (二) 客戶端連線微服務SpringCloud客戶端
- 如何使用Redshift客戶端工具SQL Workbench來連線Redshift客戶端SQL
- python socketserver處理客戶端的流程PythonServer客戶端
- Clickhouse-客戶端查詢命令客戶端
- Solr 客戶端查詢語法Solr客戶端
- 掌握遠端連線,暢享Mac SSH客戶端Termius的便利之道Mac客戶端
- netty服務端監聽客戶端連線加入和斷開事件Netty服務端客戶端事件
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- 第三方客戶端連線網易郵箱客戶端
- Qt TCP通訊客戶端斷開連線有哪些方法QTTCP客戶端
- Android客戶端網路預連線優化機制探究Android客戶端優化
- python中socket建立客戶連線Python
- 某客戶系統tomcat連線池連線異常Tomcat
- netty建立數萬客戶端連線,並主動發訊息Netty客戶端
- Android客戶端網路預連線最佳化機制探究Android客戶端
- MQTT 客戶端自動重連實踐|構建可靠 IoT 裝置連線MQQT客戶端
- 雲端計算學習路線教程大綱課件:客戶端查詢客戶端
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- python 實現 TCP、UDP 客戶端最簡流程PythonTCPUDP客戶端