天天看點

oracle listener 靜态&動态注冊

Oracle listener靜态及動态注冊總結

簡介:這是Oracle listener靜态及動态注冊總結的詳細頁面,介紹了和oracle,ORACLE,Oracle,10g有關的知識。

Oracle listener靜态及動态注冊總結

簡介:這是Oracle listener靜态及動态注冊總結的詳細頁面,介紹了和oracle,ORACLE,Oracle,10g有關的知識。

  一、什麼是注冊?

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

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

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

  二、靜态注冊

  靜态注冊就是執行個體啟動時讀取listener.ora檔案的配置,将執行個體和服務注冊到監聽程式。無論何時啟動一個資料庫,預設地都有兩條資訊注冊到監聽器中:資料庫伺服器對應的執行個體和服務。

  靜态注冊時,listener.ora中的GLOBAL_DBNAME向外提供服務名,listener.ora中的SID_NAME提供注冊的執行個體名。

和 "Oracle listener靜态及動态注冊總結" 有關的資料庫程式設計小帖士:

strong>ASIN

ASIN函數傳回一數值的反正弦值。結果以弧度表示,且在-PI/2到PI/2之間。

  采取靜态注冊方法時,listener.ora中的内容如下:

SID_LIST_LISTENER =

  (SID_LIST =

  (SID_DESC =

  (SID_NAME = PLSExtProc)

  (ORACLE_HOME = D:oracleproduct10.2.0db_1)

  (PROGRAM = extproc)

  )

  (SID_DESC =

  (GLOBAL_DBNAME =orcl)

  (ORACLE_HOME = D:oracleproduct10.2.0db_1)

  (SID_NAME =orcl)

  )

  (SID_DESC =

  (GLOBAL_DBNAME =orcl1)

  (ORACLE_HOME = D:oracleproduct10.2.0db_1)

  (SID_NAME =orcl)

  )

  )

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

  三、動态注冊

  動态注冊是在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的值。

  注冊到監聽器中的服務值從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中的内容如下:

SID_LIST_LISTENER =

  (SID_LIST =

  (SID_DESC =

  (SID_NAME = PLSExtProc)

  (ORACLE_HOME = D:oracleproduct10.2.0db_1)

  (PROGRAM = extproc)

  )

  )

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

  動态注冊預設隻注冊到預設的監聽器上(名稱是LISTENER、端口是1521、協定是TCP),如果需要向非預設監聽注冊,則需要配置local_listener參數!

  如果沒有顯式設定service_names和instance_name的值,那麼僅當資料庫在監聽器運作之後啟動時,動态注冊才會發生;在這種情況 下,如果監聽器後來發生了重新開機,動态注冊資訊将會丢失。顯然,最好在所有的資料庫啟動之前先啟動監聽器,這樣就會避免沒有顯式設定 service_names和instance_name的值時,若重新開機監聽器帶來的動态注冊資訊丢失的情況。

  為初始化參數 service_names和instance_name設定顯式的值是個值得可取的方法和建議。因為如果監聽器在資料庫運作過程中要重新啟 動,僅當你在init.ora檔案中顯式地設定了service_names和instance_name的值時,每個資料庫的PMON程序才會在很短的 時間之内完成動态注冊。

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

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

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

  動态注冊的資料庫通過狀态資訊中的狀态READY或狀态BLOCKED(對于一個備用資料庫)來指明。不管關閉何時資料庫,動态注冊的資料庫都會動态地從 監聽器登出,而與之相關的資訊将從狀态清單中消失。這樣,不管資料庫是在運作還是已經關閉,監聽器總是知道它的狀态。該資訊将被用于連接配接請求的回退 (fallback)和負載平衡。