【監聽】動態註冊和靜態註冊

bitifi發表於2015-11-30

不管是動態監聽還是靜態監聽,前提就是lsnrctl start listenername要先執行,區別就是靜態監聽是監聽啟動時讀取到的監聽配置檔案中(除預設監聽以外)的資訊,動態監聽就是資料庫例項啟動時或每隔一分鐘PMON註冊到預設監聽中的資訊

  

什麼是註冊

  註冊就是將資料庫作為一個服務註冊到監聽程式。客戶端不需要知道資料庫名和例項名,只需要知道該資料庫對外提供的服務名或SID就可以申請連線到資料庫。這個服務名或SID可能與例項名一樣,也有可能不一樣。

  在資料庫伺服器啟動過程中,資料庫伺服器會向監聽程式註冊相應的服務(無論何時啟動一個資料庫,預設地都有兩條資訊註冊到監聽器中:service_names和instance_name即lsnrctl status時顯示的ServiceInstance

  相當於是這樣:在資料庫伺服器和客戶端之間有一監聽程式(Listener),在監聽程式中,會記錄相應資料庫對應的服務名(一個資料庫可能對應有多個服務名),當客戶端需要連線資料庫時,只需要提供服務名,就可以建立客戶端和伺服器之間的連線。

 

動態註冊:

資料庫例項啟動的時候PMON程式根據spfile.ora中的值將instance_name,service_names兩個引數值註冊到預設監聽中(不管有沒有listener.ora檔案,預設監聽都是存在的)。不管什麼時候PMON程式都會每隔一分鐘根據spfile.ora中的值將instance_name,service_names兩個引數值註冊到預設監聽中

如果lsnrctl stop後再lsnrctl start,資料庫例項啟動的時候動態註冊的資訊會丟失,不過一分鐘後恢復正常,因為每隔一分鐘,PMON程式會向監聽進行動態註冊,就正常了

 

動態註冊預設只註冊到預設的監聽器上(hosthostname不是ip、埠是1521、協議是TCP,關於監聽器名稱則隨便不一定非得是LISTENER),如果需要向非預設監聽註冊,則需要配置local_listener引數,配置該引數值是監聽器的名稱,比如配置為lsn2,對應埠123456,則動態註冊就不會再動態到1521,就註冊到123456了

 

動態註冊發生的時間:每隔一分鐘(時間間隔是1分鐘的前提是服務端已經啟動)或資料庫例項啟動的時候

 

所以動態註冊,一般先啟動監聽程式再啟動oracle服務,因為oracle伺服器啟動時會動態註冊,如果先啟動oracle,再啟動監聽程式,則隔一分鐘再看看

 

 

一個動態註冊的案例

lsnrctl status發現沒有動態註冊

發現預設監聽配置的host=伺服器名稱

檢視ifconfig發現ip192.168.189.128

/etc/hosts中伺服器名稱對應的ip192.168.182.128

至此找到原因,把/etc/hosts182改為189即可

說明:動態註冊是把資料庫資訊當作服務註冊到監聽中的hostport中,如果host中配置的資訊為ip,但是實際伺服器上不存在這個ip則無法動態註冊,如果host中配置的是伺服器名稱,而伺服器名稱不存在或伺服器名稱在/etc/hosts中對應的ip實際上不存在則無法動態註冊

 

 

 

靜態註冊:

監聽程式啟動時讀取listener.ora檔案的配置,將listener.ora檔案內容中的例項名(SID_NAME)和服務名(GLOBAL_DBNAME,如果listener.ora沒有GLOBAL_DBNAME,則預設GLOBAL_DBNAME=SID_NAME)註冊到監聽器中(監聽器的名字存在listener.ora檔案中

靜態註冊時,listener.ora中的GLOBAL_DBNAME向外提供服務名,listener.ora中的SID_NAME提供註冊的例項名。

採取靜態註冊方法時,listener.ora中的內容如下:

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

      (ADDRESS = (PROTOCOL = TCP)(HOST = i-122F6351)(PORT = 1521))

    )

  )

 

LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

 

SID_LIST_LISTENER2 =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /opt/oracle/product/11.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /opt/oracle/product/11.2.0/db_1)
      (SID_NAME = orcl)
    )
  (SID_DESC =
      (GLOBAL_DBNAME = orcl1)
      (ORACLE_HOME = /opt/oracle/product/11.2.0/db_1)
      (SID_NAME = orcl)
    )
  )

ADR_BASE_LISTENER = D:\oracle\product\10.2.0\db_1

該檔案表明資料庫例項名為orcl,預設監聽為listener,靜態監聽listener2則向外提供了兩個服務:orclorcl1

 

 

靜態監聽如果有非預設監聽器listener以外的其他名稱的監聽器,則操作方式如下,前提是兩個監聽中的port和key不能一樣,否則也只能啟動一個。

lsnrctl start listenername

lsnrctl status listenername

lsnrctl stop listenername

 

 

Lsnrctl statusService的值--對於動態註冊和靜態註冊,Service有不同的取值

對於態註冊
優先順序別service_names.db_domain=db_unique_name.db_domain>db_name.db_domain
如果有引數值service_names\db_unique_name,
則拼接service_names、db_unique_name引數值和db_domain引數值註冊到監聽,即兩個值
如果只有引數值service_names,且值和db_name值不一樣
則拼接service_names、db_name引數值和db_domain引數值註冊到監聽,即兩個值
如果只有引數值db_unique_name,且值和db_name值不一樣
則拼接db_unique_name引數值和db_domain引數值註冊到監聽,即一個值


 

對於態註冊:

Service的值是GLOBAL_DBNAME(如果listener.ora檔案沒有的話,預設使用listener.ora檔案的SID_NAME

 

 

 

lsnrctl start時(一般先讀本使用者下的listener.ora檔案,發現沒有listener.ora檔案就不讀這個檔案)只啟動監聽名稱為listener、埠為1521tcp協議、hosthostname的監聽。

 

沒有listener.ora檔案時比預設listener.ora檔案只是少了一個PROTOCOL = IPC的外部程式呼叫介面,為了規範配置,我們還是不刪除listener.ora檔案,讓它預設保留ipctcp協議

 

實驗過,沒有listener.ora檔案時lsnrctl start時預設的監聽器名稱就是LISTENER,內容為如下

Listening Endpoints Summary..

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=i-122F6351)(PORT=1521)))


所以可以說listener.ora檔案裡面配置的內容主要是靜態監聽,需要listener.ora檔案主要為了新增靜態監聽global_dbname\sid_nameSID_LIST_LISTENER)和新增額外的監聽器名稱

如下圖說明lsnrctl status和 lsnrctl status listener一樣


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

相關文章