Oracle Listener

paynefu發表於2013-06-29
oracle listener註冊方式兩種:動態註冊和靜態註冊。
1、靜態註冊:即例項啟動時讀取listener.ora檔案的配置,將例項和服務註冊到監聽程式。無論何時啟動一個資料庫,預設地都有兩條資訊註冊到監聽器中:資料庫伺服器對應的例項和對外服務。 
 如在listener.ora檔案中:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
 
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
      (PROGRAM = extproc)
    )
   (SID_DESC =
      (GLOBAL_DBNAME = paynepm)  #paynepm為對外服務
      (ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
      (SID_NAME = payne)   #payne為例項名
    )
   (SID_DESC =
      (GLOBAL_DBNAME = paynefu) #paynefu為對外服務
      (ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
      (SID_NAME = payne) #payne為例項名
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

在客戶端的tnsnames.ora檔案中就可以新增:
 py =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = paynepm)
    )
  )

py =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = paynefu)
    )
  ) 
 在客戶端測試
 
SQL> conn ff/ff@py
已連線。
2、動態註冊:instance啟動的時候PMON程式根據init.ora中的instance_name,service_names兩個引數將例項和服務動態註冊到listener中。採取動態註冊方法時,listener.ora中的內容如下: 
預設動態註冊:

 LSNR1 =

    (DESCRIPTION_LIST =

       (DESCRIPTION =

          (ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT= 1521))

    )

     )

 動態註冊預設只註冊到預設的監聽器上(埠是1521、協議是TCP)因為pmon只會動態註冊port等於1521的監聽,否則pmon不能動態註冊listener,如果需要向非預設監聽註冊,則需要配置local_listener引數!動態預設註冊與非預設註冊都是透過local_listener引數來判斷的,如果值為空,則是預設註冊,若為非空,則是非預設註冊。如下:
動態非預設註冊(即埠非1521):
Listener.ora中新增:
LSNR2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))
  )
再配置local_listener引數:
alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))';

C:\Documents and Settings\Administrator>lsnrctl status lsnr2

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -2013 09:
5:35

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

正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=paynefu)(PORT=1522)))
LISTENER 的 STATUS
------------------------
別名                      lsnr2
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Prod
ction
啟動日期                  31-5月 -2013 09:03:57
正常執行時間              0 天 0 小時 1 分 42 秒
跟蹤級別                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
監聽程式引數檔案          D:\oracle\product\10.2.0\db_1\network\admin\listener.
ra
監聽程式日誌檔案          D:\oracle\product\10.2.0\db_1\network\log\lsnr2.log
監聽端點概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=paynefu)(PORT=1522)))
服務摘要..
服務 "fb" 包含 1 個例程。                 ——————該服務名就是資料庫中的service_names.db_domain,如下:
SQL> show parameter db_domain

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string
SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      fb    (這個service_names可以為多個,就如靜態註冊中的global_dbname,對外提供服務)

  例程 "fb", 狀態 READY, 包含此服務的 1 個處理程式...    ——————例項名
服務 "fbXDB" 包含 1 個例程。
  例程 "fb", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "fb_XPT" 包含 1 個例程。
  例程 "fb", 狀態 READY, 包含此服務的 1 個處理程式...
命令執行成功


建議:一個對外的服務名對應一個客戶端,這樣有利於網路資源監控、問題的判斷

3、如何區分是動態註冊還是靜態註冊?
lsnrctl status一下:
 
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                03-MAY-2013 15:33:22
Uptime                    0 days 0 hr. 16 min. 14 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /db/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /db/oracle/diag/tnslsnr/for11g/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.169.0.200)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "paynefu" has 1 instance(s).
  Instance "payne", status UNKNOWN, has 1 handler(s) for this service...
Service "paynepm" has 1 instance(s).
  Instance "payne", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

看到上面的UNKNOWN沒? 表示靜態註冊
的設定這時監聽器用來表明它不知道關於該例項的任何資訊,只有當客戶發出連線請求時,它才檢查該例項是否存在。
 
動態註冊的資料庫透過狀態資訊中的狀態READY或狀態BLOCKED(對於一個備用資料庫)來指明。不管關閉何時資料庫,動態註冊的資料庫都會動態地從 監聽器登出,而與之相關的資訊將從狀態列表中消失。這樣,不管資料庫是在執行還是已經關閉,監聽器總是知道它的狀態。該資訊將被用於連線請求的回退和負載平衡。

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

相關文章