本文大部分為轉載。
原文作者1:realkid4,原文地址:鏈接
原文作者2:chyinzi,原文地址:鏈接
1,監(jiān)聽器的作用
Oracle監(jiān)聽器(listener)是一個重要的數(shù)據(jù)庫服務器組件,在整個Oracle體系結構中,扮演著重要的作用。
監(jiān)聽器Lisener功能
從當前的Oracle版本看,Listener主要負責下面的幾方面功能:
監(jiān)聽客戶端請求
監(jiān)聽器運行在數(shù)據(jù)庫服務器之上,與Oracle實例(可為多個)相關關聯(lián),是一個專門的進程process,在Windows的服務項目或者Linux的運行進程列表中,都會看到對應的運行進程。
Windows上進程名為TNSLSNR,Linux/Unix平臺上是lsnrctl。
監(jiān)聽器在服務器指定端口(默認端口1521)監(jiān)聽客戶端的請求。為客戶端請求分配Server Process
監(jiān)聽器只負責接聽請求,之后將請求轉接給Oracle Server Process。
監(jiān)聽器接收到請求之后,就向操作系統(tǒng)(或者Dispatcher組件)要求Fork或分配一個Server Process與客戶端相連。
在Oracle的服務模式下,客戶端進程是不允許直接操作數(shù)據(jù)庫實例和數(shù)據(jù),而是通過一個服務進程Server Process(也稱為影子進程)作為代理。注冊實例服務
本質上講,Listener是建立實例和客戶端進程之間聯(lián)系的橋梁。Listener與實例之間的聯(lián)系,就是通過注冊的過程來實現(xiàn)的。注冊的過程就是實例告訴監(jiān)聽器,它的數(shù)據(jù)庫數(shù)據(jù)庫實例名稱instance_name和服務名service_names。
在監(jiān)聽器注冊好信息,就能根據(jù)客戶端請求查找監(jiān)聽注冊信息,找到正確的服務實例名稱。
目前Oracle版本中,提供動態(tài)注冊和靜態(tài)注冊兩種方式。錯誤轉移failover
Failover是RAC容錯的一個重要方面功能,其功能是在數(shù)據(jù)庫實例崩潰的時候,可以自動將請求轉移到其他可用實例上的一種功能。
在這個過程中,發(fā)現(xiàn)實例已經(jīng)崩潰,并且將請求轉移到其他實例上,就屬于Listener的功能。負載均衡衡量
在RAC架構中,Oracle實現(xiàn)了負載均衡。當一個客戶請求到來時,Oracle會根據(jù)當前RAC集群環(huán)境中所有實例的負載情況,避開負載較高的實例,將請求轉移到負載較低的實例進行處理。
在早期RAC版本中,負載輕重的衡量是根據(jù)監(jiān)聽器當前維護連接數(shù)目來確定的,而不是實時查看多實例的負載。
RAC環(huán)境中的監(jiān)聽器之間進行溝通通信。
2,監(jiān)聽器的動/靜態(tài)注冊
靜態(tài)注冊,顧名思義,就是顯式的指定監(jiān)聽器程序要為哪個數(shù)據(jù)庫例程做監(jiān)聽,以及監(jiān)聽該例程時使用的服務名。
靜態(tài)注冊情況下,監(jiān)聽程序不知道所監(jiān)聽例程服務是否存在。動態(tài)注冊,是與靜態(tài)注冊相對應的一種注冊方法,不需要指定instance_name和service_name,而是在數(shù)據(jù)庫例程啟動時,通過例程的后臺進程PMON定期向監(jiān)聽器注冊服務。
動態(tài)注冊情況下,監(jiān)聽程序知道例程服務的狀態(tài)。
那么,如何區(qū)分數(shù)據(jù)庫是動態(tài)注冊還是靜態(tài)注冊呢?
- 使用lsnrctl的status命令
在運行l(wèi)snrctl的status命令時,會看到如下返回值:
LSNRCTL> status
正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
啟動日期 07-11月-2017 13:24:32
正常運行時間 0 天 0 小時 51 分 31 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監(jiān)聽程序參數(shù)文件 C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
監(jiān)聽程序日志文件 c:\app\administrator\diag\tnslsnr\class11g\listener\alert\log.xml
監(jiān)聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=class11g)(PORT=1521)))
服務摘要..
……
服務 "ora11g" 包含 1 個實例。
實例 "ora11g", 狀態(tài) READY, 包含此服務的 1 個處理程序...
服務 "sales" 包含 1 個實例。
實例 "sales", 狀態(tài) READY, 包含此服務的 1 個處理程序...
……
命令執(zhí)行成功
根據(jù)返回狀態(tài)可以判斷數(shù)據(jù)庫的注冊方式
- 狀態(tài)UNKOWN即表明為靜態(tài)注冊(手動填寫參數(shù))
- 狀態(tài)為READY的記錄,表明為動態(tài)注冊(listener.ora參數(shù)由PMON進程自動從參數(shù)文件獲?。?/li>
- 使用Oracle自帶的圖形化管理工具Net Manager
靜態(tài)注冊
監(jiān)聽配置中,數(shù)據(jù)庫服務中的全局數(shù)據(jù)庫名,可以寫任意內(nèi)容,與數(shù)據(jù)庫無關,只要保證SID正確即可連上數(shù)據(jù)庫。
由于靜態(tài)注冊,參數(shù)是手動靜態(tài)添加,與數(shù)據(jù)庫無關。數(shù)據(jù)庫無法確認監(jiān)聽是否正確配置。因此,lsnrctl中的status顯示狀態(tài)為unkown。即不保證能連通數(shù)據(jù)庫。
注意:靜態(tài)注冊監(jiān)聽,客戶端在配置tnsnames.ora服務命名時,“(Oracle 8i或更高版本)服務名”里填寫內(nèi)容要與服務端靜態(tài)注冊監(jiān)聽器時的全局數(shù)據(jù)庫名(即GLOBAL_DBNAME)一致。否則,無法連通。
配置靜態(tài)監(jiān)聽前,lsnrctl中status顯示如下
服務摘要..
……
服務 "ora11g" 包含 1 個實例。
實例 "ora11g", 狀態(tài) READY, 包含此服務的 1 個處理程序...
服務 "sales" 包含 1 個實例。
實例 "sales", 狀態(tài) READY, 包含此服務的 1 個處理程序...
……
對配置文件listener.ora修改如下
SID_LIST_LISTENER =
(SID_LIST =
……
(SID_DESC =
(GLOBAL_DBNAME = Example_1)
(ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
(SID_NAME = sales)
)
)
其中,Example_1是監(jiān)聽配置時,數(shù)據(jù)庫服務中的“全局數(shù)據(jù)庫名”的值(即配置文件中GLOBAL_DBNAME的值),“sales”是監(jiān)聽配置中,數(shù)據(jù)庫服務中SID讀到的值(即SID_NAME的值)。
同時,客戶端需要正確配置tnsname.ora文件,服務名(SERVICE_NAME)需要與服務器配置中的GLOBAL_DBNAME一致,例如上文的Example_1。否則,將連接不到數(shù)據(jù)庫。
客戶端tnsname.ora文件中相應的配置見下方
Example_1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = class11g)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
ORA11G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = class11g)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
這里的Example_1,為服務名,可以設置為任意值,只要在客戶端連接服務器時。
此時,服務器端使用lsnrctl的status命令,顯示如下
服務 "Example_1" 包含 1 個實例。
實例 "sales", 狀態(tài) UNKNOWN, 包含此服務的 1 個處理程序...
服務 "ora11g" 包含 1 個實例。
實例 "ora11g", 狀態(tài) READY, 包含此服務的 1 個處理程序...
在客戶端使用sqlplus登錄,成功,顯示如下
C:\Documents and Settings\Administrator>sqlplus scott/tiger@example_1
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 11月 7 17:43:54 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SCOTT@example_1>
動態(tài)注冊
仍然使用上面的例子。
可以注意到,在Example_1例程之外,還有一個數(shù)據(jù)庫服務ora11g并沒有在監(jiān)聽器配置文件中設置,但可以如Example_1一樣正常使用。
再看一下上面服務器端使用lsnrctl的status命令,顯示如下
服務 "Example_1" 包含 1 個實例。
實例 "sales", 狀態(tài) UNKNOWN, 包含此服務的 1 個處理程序...
服務 "ora11g" 包含 1 個實例。
實例 "ora11g", 狀態(tài) READY, 包含此服務的 1 個處理程序...
再次展示listener.ora的配置相關部分如下
SID_LIST_LISTENER =
(SID_LIST =
……
(SID_DESC =
(GLOBAL_DBNAME = Example_1)
(ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
(SID_NAME = sales)
)
)
在客戶端使用sqlplus登錄,成功,顯示如下
C:\Documents and Settings\Administrator>sqlplus scott/tiger@ora11g
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 11月 7 17:59:20 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SCOTT@ora11g>
可見,這里的ora11g就是動態(tài)注冊。
- 可以看到,在上面listener.ora的配置中,并沒有ora11g的靜態(tài)注冊信息,而且在lsnrctl的status命令中,ora11g的狀態(tài)為Ready。
-
通過Oracle自帶的管理工具Net Manager能看到,在數(shù)據(jù)庫服務中,僅注冊了sales,并沒有注冊ora11g(見下圖)
net manager.jpg
