Oracle監(jiān)聽器相關知識(1)

本文大部分為轉載。
原文作者1:realkid4,原文地址:鏈接
原文作者2:chyinzi,原文地址:鏈接

1,監(jiān)聽器的作用

Oracle監(jiān)聽器(listener)是一個重要的數(shù)據(jù)庫服務器組件,在整個Oracle體系結構中,扮演著重要的作用。

監(jiān)聽器Lisener功能

從當前的Oracle版本看,Listener主要負責下面的幾方面功能:

  1. 監(jiān)聽客戶端請求
    監(jiān)聽器運行在數(shù)據(jù)庫服務器之上,與Oracle實例(可為多個)相關關聯(lián),是一個專門的進程process,在Windows的服務項目或者Linux的運行進程列表中,都會看到對應的運行進程。
    Windows上進程名為TNSLSNR,Linux/Unix平臺上是lsnrctl。
    監(jiān)聽器在服務器指定端口(默認端口1521)監(jiān)聽客戶端的請求。

  2. 為客戶端請求分配Server Process
    監(jiān)聽器只負責接聽請求,之后將請求轉接給Oracle Server Process。
    監(jiān)聽器接收到請求之后,就向操作系統(tǒng)(或者Dispatcher組件)要求Fork或分配一個Server Process與客戶端相連。
    在Oracle的服務模式下,客戶端進程是不允許直接操作數(shù)據(jù)庫實例和數(shù)據(jù),而是通過一個服務進程Server Process(也稱為影子進程)作為代理。

  3. 注冊實例服務
    本質上講,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)注冊兩種方式。

  4. 錯誤轉移failover
    Failover是RAC容錯的一個重要方面功能,其功能是在數(shù)據(jù)庫實例崩潰的時候,可以自動將請求轉移到其他可用實例上的一種功能。
    在這個過程中,發(fā)現(xiàn)實例已經(jīng)崩潰,并且將請求轉移到其他實例上,就屬于Listener的功能。

  5. 負載均衡衡量
    在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)注冊呢?

  1. 使用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>
  1. 使用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)注冊。

  1. 可以看到,在上面listener.ora的配置中,并沒有ora11g的靜態(tài)注冊信息,而且在lsnrctl的status命令中,ora11g的狀態(tài)為Ready。
  2. 通過Oracle自帶的管理工具Net Manager能看到,在數(shù)據(jù)庫服務中,僅注冊了sales,并沒有注冊ora11g(見下圖)


    net manager.jpg
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ORA-13000: 維數(shù)超出范圍 ORA-13001: 維數(shù)不匹配錯誤 ORA-13002: 指定的級別超出范圍...
    thinkact閱讀 20,046評論 1 5
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評論 19 139
  • 一、源題QUESTION 36Your database is open and the LISTENER lis...
    貓貓_tomluo閱讀 1,470評論 0 2
  • 本文大部分為轉載。 原文作者1:realkid4,原文地址:鏈接原文作者2:chyinzi,原文地址:鏈接 1,l...
    千幻流光閱讀 1,036評論 0 1
  • 我是在偶然的一個機會,耳聞簡書,就想著在應用商店搜搜看,結果真的有這個app,便下載下來,就是今晚,就是現(xiàn)在和以后...
    她予她夢啊閱讀 191評論 0 0

友情鏈接更多精彩內(nèi)容