19.Oracle的動態監聽和靜態監聽


靜態注冊:通過解析listene.ora文件

動態注冊:由PMON進程動態注冊至監聽中

在沒有listener.ora配置文件的情況下,如果啟動監聽,則監聽為動態注冊。用圖形化netca創建的監聽,默認也為動態注冊

1.靜態注冊

listener.ora文件,監聽的配置文件,靜態注冊讀取該文件,動態注冊,不必要

可以通過netca工具創建,也可以手動編輯。典型的listener.ora文件內容:

LISTENER_PHAMR = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = phamrdb1-vip)(PORT = 1521)) 
  )

 

SID_LIST_LISTENER_PHALR = 
  (SID_LIST = 
    (SID_DESC = 
      (GLOBAL_DBNAME = phalr) 
      (ORACLE_HOME = /oracle/product/11.2.0) 
      (SID_NAME = phalr) 
    ) 
  )

listener.ora文件兩大模塊:

LISTENER模塊:監聽名字、連接協議、監聽主機、監聽端口等基本配置信息

SID_LIST_LISTENER模塊:配置監聽的靜態注冊特性,包含數據庫服務名、ORACLE_HOME、實例名等信息。

注意:SID_NAME,就是數據庫實例名,在Linux環境大小寫敏感

GLOBAL_DBNAME就是數據庫服務名,可以省略,默認和SID_NAME保持一致,也可以不一致。

ORACLE_HOME,默認和$ORACLE_HOME環境變量保持一致。Windows,該參數無效,取自注冊表。

靜態注冊,監聽不知道實例的具體狀態,所以監聽啟動之初查看實例信息,其狀態信息顯示為UNKNOWN

2.動態注冊

在動態注冊監聽的環境中,listener.ora文件可以不包括當前數據庫的實例信息,所以這個文件不必要。動態注冊是在instance啟動的時候PMON進程根據init.ora中的instance_name,service_names兩個參數將實例和服務動態注冊到listener中,首先要在init.ora中指定instance_name,service_names兩個參數的值。在sqlplus下通過show parameter service_names 和show paramerter instance_name查看這兩個值

實例啟動時,會由Oracle PMON進程將數據庫實例信息動態注冊至監聽上。

當Oracle實例關閉時,會再次由PMON進程自動從監聽里面撤銷當前實例信息。

所以,要實現動態注冊,數據庫的實例至少要處於nomount狀態

監聽動態注冊時的實例狀態:來自PMON進程動態注冊時的實例狀態,一般有3種狀態:READY、BLOCKED和RESTRICED

READY:表示數據庫實例已經處於mount或者open狀態,可以接受客戶端連接

BLOCKED:表示數據庫實例還處於nomount狀態或者該實例類型為ASM實例,不接受客戶端連接,如果這時候客戶端去連

               接數據庫會報ora-12528錯誤

RESTRICED:表示數據庫處於RESTRICED模式,不接受普通權限的遠程客戶端連接,如果這時候客戶端去連接數據庫會報

                  ora-12526錯誤

動態注冊默認只注冊到默認的監聽器上(名稱是LISTENER、端口是1521、協議是TCP),如果需要向非默認監聽注冊,則需要配置local_listener參數!

  如果沒有顯式設置service_names和instance_name的值,那么僅當數據庫在監聽器運行之后啟動時,動態注冊才會發生;在這種情況 下,如果監聽器后來發生了重啟,動態注冊信息將會丟失。顯然,最好在所有的數據庫啟動之前先啟動監聽器,這樣就會避免沒有顯式設置 service_names和instance_name的值時,若重啟監聽器帶來的動態注冊信息丟失的情況。

  為初始化參數service_names和instance_name設置顯式的值是個值得可取的方法和建議。因為如果監聽器在數據庫運行過程中要重新啟 動,僅當你在init.ora文件中顯式地設置了service_names和instance_name的值時,每個數據庫的PMON進程才會在很短的 時間之內完成動態注冊。

3.什么是注冊?

注冊就是將數據庫作為一個服務注冊到監聽程序。客戶端不需要知道數據庫名和實例名,只需要知道該數據庫對外提供的服務名

就可以申請連接到數據庫。這個服務名可能與實例名一樣,也有可能不一樣。

在數據庫服務器啟動過程中,數據庫服務器會向監聽程序注冊相應的服務(無論何時啟動一個數據庫,默認地都有兩條信息注冊

到監聽器中:數據庫服務器對應的實例和服務。)

相當於是這樣:在數據庫服務器和客戶端之間有一監聽程序(Listener),在監聽程序中,會記錄相應數據庫對應的服務名(一

個數據庫可能對應有多個服務名),當客戶端需要連接數據庫時,只需要提供服務名,就可以建立客戶端和服務器之間的連接。

 

4.補充一點:

  動態注冊是在instance啟動的時候PMON進程根據instance_name,service_name兩個參數將實例和服務注冊到監聽器中。由於動態注冊需要pmon進程,所以監聽必須在數據庫啟動之前啟動,否則動態注冊將失敗;在數據庫運行的過程中,如果重啟監聽也會造成動態注冊失敗。動態注冊只是注冊默認的監聽器上(名稱是listener、端口是1521、協議時TCP),如果需要向非默認的監聽注冊,則需要改變local_listener參數,將監聽的信息添加到tnsnames.ora文件中。注意,是tnsnames.ora 文件,因為pmon在動態注冊監聽時要從tnsnames.ora中讀取相關信息。例如:

SQL> alter system set local_listener=mylistener;

然后需要在tnsnames.ora中添加如下內容:

mylistener=(DESCRIPTION=

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx)(PORT = 1530))

(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx)(PORT = 1534))

)(CONNECT_DATA=(SID=oracl)))

這樣實例啟動時就會注冊到兩個不同端口的listener上,或者將local_listener參數改到特定的主機和端口上,就不需要再在tnsnames.ora中維護相關信息。但這只適用於單listener的情況:

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx)(PORT = 1522))';

SQL> alter system register;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM