理解Oracle中的監聽動態註冊

2021-08-31 22:13:04 字數 3594 閱讀 1132

[size=small]在oracle9i中,使用命令lsnrctl status可以看到如下例子:

service "lrdb" has 2 instance(s).

instance "lrdb", status unknown, has 1 handler(s) for this service...

instance "lrdb", status ready, has 1 handler(s) for this service...

這是oracle9i***行為的不同之處的第乙個線索,因為instance "lrdb"出現了兩次。出現額外條目是因為,

資料庫在啟動時通過乙個被稱為動態註冊的程序在***中註冊資訊。相應地,如果資料庫通過listener.ora

檔案中的資訊在***中註冊資料庫這稱為靜態註冊。在上面的輸出中,狀態unknown值的是靜態註冊的設定。

這是***用來表明它不知道關於該例項的任何資訊的方式,只有當客戶發出連線請求時,它才檢查該例項是否

存在。動態註冊的資料庫通過狀態資訊中的狀態ready或狀態blocked(對於乙個備用資料庫)來指明。不管何時資料庫

關閉,動態註冊的資料庫都會動態地從***登出,而與之相關的資訊將從狀態列表中消失。這樣,不管資料庫是在執行還是已經關閉,***總是知道它的狀態。該資訊將被用於連線請求的回退(fallback)和負載平衡。自我註冊功能是不能被關閉的(至少在任何可見的文件中是這樣),由於該功能帶來的好處,因此不能關閉它也並不是件壞事。當您可以免費獲得資料庫的自我註冊功能時,為什麼還需要listener.ora檔案中的靜態註冊條目呢?您對此感到疑惑,是嗎?答案是:除了幾種例外情況外,您根本不需要執行靜態註冊。這樣的結果是,只要使用預設的***埠1521,您就不再需要listener.ora檔案。然而,當(且僅當)要把日誌檔案和跟蹤資訊儲存到標準目錄中時,您或許仍然會使用listener.ora檔案。

下面是資料庫的自我註冊過程(假設在資料庫啟動之前,***已經啟動並在正常執行)。無論何時啟動乙個資料

庫,預設地都有兩條資訊註冊到***中:例項和服務。

註冊到***中的例項值從init.ora檔案中的instance_name引數取得。如果該引數沒有設定值,那麼它將取init.ora檔案中的db_name的值。在只有單個例項執行的情況下,您可以不必設定該引數,但最好將其設定為db_name的值,以充分利用動態註冊功能。然後,如果在rac中配置,您必須將集群中每個例項的instance_name引數設定為乙個唯一的值。

註冊到***中的服務值從init.ora檔案中的引數service_names取得。如果該引數沒有設定值,資料庫將拼接

init.ora檔案中的db_name和db_domain的值來註冊自己。如果選擇提供service_names值,您可以使用完全限定

的名稱(比如lrdb.oracle.com)或縮寫的名稱(比如lrdb)。如果選擇縮寫的名稱並設定了db_domain引數,注

冊到***中的服務將是service_name值和db_domain值的拼接。例如下面的設定將導致服務lrdb.oracle.com

被註冊到***中:

db_domain=oracle.com

service_name=lrdb

可選擇的,您可以在service_names引數中指定多個服務值,值之間用逗號格開;這對於共享伺服器配置是很有用的。

如果需要執行連線時故障轉移或負載均衡,或者想要在rac中配置在例項之間透明地分布連線,那麼使用service_names引數將是必要的。為啟用這些功能,您只需要將每個例項的資料庫引數檔案中的service_names設定為同乙個值,並在客戶端連線請求的service_name設定中引用該值。

為初始化引數service_names和instance_name設定顯式的值是個很好的實踐,儘管如果您沒有設定它們,oracle也會為動態註冊而生成預設值(基於db_name和db_main)。這樣做的原因是,如果***在資料庫啟動之後重新啟動,其動態註冊行為將會有一些微妙的區別.如果***在資料庫執行之後重新啟動,僅當在init.ora檔案中顯式地設定了service_names和instance_name的值時,每個資料庫的pmon程序才會在很短的時間之後自動註冊資料庫.

如果沒有顯式設定service_names和instance_name的值,那麼僅當資料庫在***執行之後啟動時,動態註冊才會

發生;在這種情況下,如果***後來發生了重啟,動態註冊資訊將會丟失。

顯然,最後在啟動任何資料庫之前啟動伺服器上的***,並完全避免***的重啟。另外,您還可以在sql*plus中使用alter system register命令,在資料庫開啟時的任何時候,手工地在***中註冊服務值。這個命令對於替換因***重啟而丟失地服務值很有用,並且它所註冊地值與在資料庫啟動時由動態註冊所設定的值完全一樣。

總而言之,oracle9i通過listener.ora中的global_dbname向外提供靜態服務,通過pmon讀初始化引數service_names、instance_name向外提供動態(真實在執行的)服務。舉例如下:

listener.ora檔案內容

sid_list_listener =

(sid_list =

(sid_desc =

(sid_name = pl***tproc)

(oracle_home = /oracle/product/9.2.0.4)

(program = extproc)

)(sid_desc =

(global_dbname = lrdb)

(oracle_home = /oracle/product/9.2.0.4)

(sid_name = lrdb)

)(sid_desc =

(global_dbname = gsid)

(oracle_home = /oracle/product/9.2.0.4)

(sid_name = lrdb)))

該檔案使得這個單例項的資料庫lrdb,向外提供了兩個服務:lrdb和gsid

初始化引數設定:instance_name=lrdb service_name=lrdb,gsid

所以動態註冊時也會對外提供兩個服務:lrdb和gsid

最後通過lsnrctl status看到的情況就是:

service "gsid" has 2 instance(s).

instance "lrdb", status unknown, has 1 handler(s) for this service...

instance "lrdb", status ready, has 1 handler(s) for this service...

service "lrdb" has 2 instance(s).

instance "lrdb", status unknown, has 1 handler(s) for this service...

instance "lrdb", status ready, has 1 handler(s) for this service...

對外提供的服務gsid和lrdb都有兩個例項(乙個靜態註冊乙個動態註冊),狀態都分別是unknown和ready。

對於客戶端來說,它不用關心資料庫的名字、例項名到底是什麼,它只需要知道資料庫對外提供的服務名就行了,

這個名字可能和例項名一樣,也可能不一樣。

[/size]

Oracle靜態監聽和動態監聽

一 靜態註冊 靜態註冊指例項啟動時讀取listener.ora配置檔案,將例項和服務註冊到監聽程式。無論何時啟動乙個資料庫,預設都有兩條資訊註冊到 中 例項和服務。sid list listener sid list sid desc global dbname ora8 sid name test...

oracle靜態監聽和動態監聽

oracle靜態監聽和動態監聽 一 什麼是註冊?註冊就是將資料庫作為乙個服務註冊到監聽程式。客戶端不需要知道資料庫名和例項名,只需要知道該資料庫對外提供的服務名 就可以申請連線到資料庫。這個服務名可能與例項名一樣,也有可能不一樣。在資料庫伺服器啟動過程中,資料庫伺服器會向監聽程式註冊相應的服務 無論...

oracle監聽動態註冊時的例項狀態

監聽動態註冊時,監聽中的例項狀態資訊來自pmon程序動態註冊時的例項狀態。一般有3種,分別為 ready blocked和restricted,如下所示。ora10g capaa admin lsnrctl status listening endpoints summary.services su...