ORACLE伺服器監聽程式LSNRCTL

2021-06-04 17:13:49 字數 4215 閱讀 7490

在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值的時靜態註冊的設定。這是***用來表明它不知道關於該例項的任何資訊的方式,

只有當客戶發出連線請求時,它才檢查該例項是否存在。

在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。

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

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

Oracle專用伺服器 共享伺服器監聽原理

一 專用伺服器和共享伺服器 1.1 原理 專有伺服器 專有伺服器模式中,使用者程序執行在客戶端的機器,專有伺服器程序執行在資料庫伺服器端的機器。使用者程序和專有伺服器程序是兩種不同型別的程序。當客戶端發出連線資料庫請求的時候,吧客戶端連線到專有伺服器程序。即使這個服務程序很空閒,這個專有伺服器進行也...

Oracle 伺服器端監聽配置

一 靜態註冊 建立埠為1521的監聽,靜態註冊,本機ip 192.168.10.2 listener address list address protocol tcp host 192.168.10.2 port 1521 sid list listener sid list sid desc g...

伺服器監聽客戶

伺服器端 private void button1 click object sender,eventargs e chatsocket.close acceptedsocket.close catch argumentnullexception es catch socketexception e...