Oracle listener動態註冊與靜態註冊

2021-05-24 14:31:19 字數 3722 閱讀 6484

一.什麼是註冊

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

在資料庫伺服器啟動過程中,資料庫伺服器會向監聽程式註冊相應的服務(無論何時啟動乙個資料庫,預設地都有兩條資訊註冊到***中:資料庫伺服器對應的例項和服務。)

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

二、動態註冊

動態註冊是在instance啟動的時候pmon程序根據init.ora中的instance_name,service_names兩個引數將例項和服務動態註冊到listener中。

首先要在init.ora中指定instance_name,service_names兩個引數的值。在sqlplus下通過show parameter service_names 和show parameter instance_name可以檢視這兩個引數的值。

註冊到***中的例項值從init.ora檔案中的instance_name引數取得。如果該引數沒有設定值,那麼它將取init.ora檔案中的db_name的值。如果在rac中配置,您必須將集群中每個例項的instance_name引數設定為乙個唯一的值。

註冊到***中的服務值從init.ora檔案中的引數service_names取得。如果該引數沒有設定值,資料庫將拼接init.ora檔案中的 db_name和db_domain的值來註冊自己。如果選擇提供service_names值,您可以使用完全限定的名稱(比如 orcl.oracle.com)或縮寫的名稱(比如orcl)。如果選擇縮寫的名稱並設定了db_domain引數,註冊到***中的服務將是 service_name值和db_domain值的拼接。例如下面的設定將導致服務orcl.oracle.com被註冊到***中:

db_domain=oracle.com

service_names=orcl ;

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

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

動態註冊預設只註冊到預設的***上(名稱是listener、埠是1521、協議是tcp),因為pmon只會動態註冊port等於1521的監聽,否則pmon不能動態註冊listener,如果需要向非預設監聽註冊,則需要配置local_listener引數!

將監聽的資訊新增到tnsnames.ora  檔案中。 注意,是tnsnames.ora 檔案, 因為pmon在動態註冊監聽時要從tnsnames.ora中讀取相關資訊。

listener =

(description =

(address = (protocol = tcp)(host = mahee)(port = 1522))

然後以sys使用者執行:

sql> alter system set local_listener=listener;

sql> alter system register;

或者:sql> alter system set local_listener='(address = (protocol = tcp)(host = mahee)(port = 1522))';

sql> alter system register;

系統已更改。

$lsnrctl status listener

如果沒有顯式設定service_names和instance_name的值,那麼僅當資料庫在***執行之後啟動時,動態註冊才會發生;在這種情況下,如果***後來發生了重啟,動態註冊資訊將會丟失。顯然,最好在所有的資料庫啟動之前先啟動***,這樣就會避免沒有顯式設定 service_names和instance_name的值時,若重啟***帶來的動態註冊資訊丟失的情況。

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

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

如果沒有顯式設定service_names和instance_name的值,那麼僅當資料庫在***執行之後啟動時,動態註冊才會發生;在這種情況下,如果***後來發生了重啟,動態註冊資訊將會丟失。顯然,最後在啟動任何資料庫之前啟動伺服器上的***,並完全避免***的重啟。

另外,您還可以在sql*plus中使用命令:

sql>alter system register;

在資料庫開啟時的任何時候,手工地在***中註冊服務值。這個命令對於替換因***重啟而丟失地服務值很有用,並且它所註冊地值與在資料庫啟動時由動態註冊所設定的值完全一樣。

動態監聽:

oracle***執行後,oracle例項在open時,會動態向監聽程式註冊其service_names和instance_name。

其中instance_name預設是:db_name

而service_names預設是:db_name.db_domain

三、靜態註冊

靜態註冊就是例項啟動時讀取listener.ora檔案的配置,將例項和服務註冊到監聽程式。無論何時啟動乙個資料庫,預設地都有兩條資訊註冊到***中:資料庫伺服器對應的例項和服務。

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

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

該檔案表明資料庫是單例項的,例項名為orcl,向外提供了兩個服務:orcl和orcl1

靜態監聽:

oracle例項執行後,監聽程式啟動時,根據listener.ora的配置註冊相應的服務。

其中global_dbname對應的是oracle對外的服務名,即初始化引數裡的service_names而sid_name對應的是oralce例項的名稱,即初始化引數裡的instance_name

既然有動態監聽為什麼還要靜態監聽呢?原因如下:

1.***不是最早啟動,oracle例項先啟動

2.***重啟

3.oracle例項沒有open

四、查詢某服務是靜態註冊還是動態註冊

可以使用命令lsnrctl status來檢視某服務是靜態註冊還是動態註冊。

例項狀態為unknown值時表明此服務是靜態註冊的設定。這時***用來表明它不知道關於該例項的任何資訊,只有當客戶發出連線請求時,它才檢查該例項是否存在。

動態註冊的資料庫通過狀態資訊中的狀態ready或狀態blocked(對於乙個備用資料庫)來指明。不管關閉何時資料庫,動態註冊的資料庫都會動態地從 ***登出,而與之相關的資訊將從狀態列表中消失。這樣,不管資料庫是在執行還是已經關閉,***總是知道它的狀態。該資訊將被用於連線請求的回退(fallback)和負載平衡。

說明:整理自網路

oracle listener靜態註冊與動態註冊

對於這個listener註冊,之前都隨便配的,反正都能配好,也能正常執行。找了個文章看看,2,原來它們的區別在這啊!汗啊 動態註冊 自己在listener檔案中指明sid 和service name,listener啟動的時候,會從listener檔案中讀取到!靜態註冊 不需要自己指定sid和ser...

Oracle listener靜態註冊和動態註冊

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

Oracle Listener啟動失效

在一次windows優化大師優化後,我的xp中裝的oracle伺服器的listener 不能啟動了,看了網上的一些資料,找到了原因,是因為登錄檔中的配置服務配置資訊被刪除調了,解決方式把一下資訊重新匯入到登錄檔中 windows registry editor version 5.00 hkey l...