天天看點

ORACLE 監聽動态注冊與靜态注

http://blog.csdn.net/zhaowenzhong/article/details/6118478

注冊就是将資料庫作為一個服務注冊到監聽程式中。用戶端不需要知道資料庫名和執行個體名,隻需要知道該資料庫對外提供的服務名就可以申請連結到資料庫。這個服務名可以與資料庫名一樣,也有可能不一樣。

在資料庫服務啟動的過程中,資料庫伺服器向監聽程式中注冊相應的服務。無論何時啟動資料庫,預設的都有兩條資訊注冊到監聽器中,即資料庫伺服器對應的執行個體和服務。用戶端和伺服器之間的連結,隻需要提供一個服務名就可以了。

區分動态注冊和靜态注冊

(1)使用listener.ora檔案判斷

動态注冊

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(PROGRAM = extproc)

(SID_NAME = PLSExtProc)

(ORACLE_HOME = D:oradataorcl)

)

)

靜态注冊

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(PROGRAM = extproc)

(SID_NAME = PLSExtProc)

(ORACLE_HOME = D:oradataorcl)

)

(SID_DESC =

(GLOBAL_DBNAME = orcl)

(ORACLE_HOME = D:oradataorcl)

(SID_NAME = ORCL)

)

(SID_DESC =

(GLOBAL_DBNAME = orcl1)

(ORACLE_HOME = D:oradataorcl)

(SID_NAME = ORCL)

)

)

通過檢視雖然可以大緻看出,但是這種方法并不能和明确的現實資料庫在運作時的實際情況

(2)使用lsnrctl status指令

三、動态注冊

動态注冊是在instance啟動的時候PMON(Process Monitor程序螢幕)程序根據INIT.ORA中的instance_name,service_name兩個參數将執行個體和服務注冊到監聽器中.

動态注冊時的listener.ora的檔案内容如下

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(PROGRAM = extproc)

(SID_NAME = PLSExtProc)

(ORACLE_HOME = D:oradataorcl)

)

)

由于動态注冊需要pmon程序,是以監聽必須在資料庫啟動之前啟動,否則動态注冊将失敗;在資料庫運作的過程中,如果重新開機監聽也會造成動态注冊失敗

動态注冊隻是注冊預設的監聽器上(名稱是listener、端口是1521、協定時TCP),如果需要向非預設的監聽注冊,則需要改變local_listener參數

将監聽的資訊添加到tnsnames.ora 檔案中。 注意,是tnsnames.ora 檔案, 因為pmon在動态注冊監聽時要從tnsnames.ora中讀取相關資訊。

LISTENER =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = DaveDai)(PORT = 1522))

)

然後以sys用戶運作:

SQL> alter system set local_listener=listener;

SQL> alter system register;

或者:

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

SQL> alter system register;

動态注冊的好處是簡單友善,但是容易發生注冊失敗

四、靜态注冊

靜态注冊就是執行個體啟動時讀取listener.ora檔案的配置,将執行個體和服務注冊到監聽程式中

靜态注冊時的listener.ora中的内容如下

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(PROGRAM = extproc)

(SID_NAME = PLSExtProc)

(ORACLE_HOME = D:oradataorcl)

)

(SID_DESC =

(GLOBAL_DBNAME = orcl)

(ORACLE_HOME = D:oradataorcl)

(SID_NAME = ORCL)

)

(SID_DESC =

(GLOBAL_DBNAME = orcl1)

(ORACLE_HOME = D:oradataorcl)

(SID_NAME = ORCL)

)

)

golbal_dbname是資料庫對外提供的服務名,sid_name是執行個體名,該檔案說明資料庫是單執行個體資料庫,執行個體名為orcl,向外提供了兩個服務orcl和orcl1.

靜态注冊的好處可以總結為

1、監聽不是最早啟動

2、資料庫運作期間,監聽發成重新開機

3、oracle執行個體還沒有open

當發生上述三種情況時,不會發生監聽注冊失敗

4、查詢某服務是靜态注冊還是動态注冊 

  可以使用指令lsnrctl status來檢視某服務是靜态注冊還是動态注冊。 

  執行個體狀态為UNKNOWN值時表明此服務是靜态注冊的設定。這時監聽器用來表明它不知道關于該執行個體的任何資訊,隻有當客戶發出連接配接請求時,它才檢查該執行個體是否存在。 

  動态注冊的資料庫通過狀态資訊中的狀态READY或狀态BLOCKED(對于一個備用資料庫)來指明。不管關閉何時資料庫,動态注冊的資料庫都會動态地從 監聽器登出,

而與之相關的資訊将從狀态清單中消失。這樣,不管資料庫是在運作還是已經關閉,監聽器總是知道它的狀态。該資訊将被用于連接配接請求的回退 (fallback)和負載平衡。