動態監聽與靜態監聽

在lsnrctl命令的status時,常會看到如下返回值:

Service "elvis" has 2 instance(s).
  Instance "elvis", statusUNKNOWN, has 1 handler(s) for this service...
  Instance "elvis", statusREADY, has 1 handler(s) for this service...
Service "elvisXDB" has 1 instance(s).
  Instance "elvis", statusREADY, has 1 handler(s) for this service...
The command completed successfully

這裏的,狀態UNKOWN即表明爲靜態註冊(手動填寫參數);

狀態爲READY的記錄,表明爲動態註冊(listener.ora參數由PMON進程自動從參數文件獲取);你可能會奇怪,可能我這個與你的有點不同,elvis下面有兩個實例,原因是elvis是我的實例名,系統自帶了一個,而服務名默認的話是與數據庫名一致(如果沒有域名的話),可能對於實例名,域名,服務名有點繞,這個概念可以看我的另一篇帖子:

http://blog.csdn.net/elvis_dataguru/article/details/8984961

而unknown那個是我手動創建的監聽(靜態監聽),而創建的我也用了elvis,也就是與系統的重複了,所以合併到了一起,如果你手動創建個別的名字,比如a(在創建監聽的時候指定的全局數據庫名,這個可以隨便起,SID一定要保持一致啦!!!),那就會如下:

Service "a" has 2 instance(s).
  Instance "elvis", statusUNKNOWN, has 1 handler(s) for this service...
  Instance "elvis", statusREADY, has 1 handler(s) for this service...
Service "elvisXDB" has 1 instance(s).
  Instance "elvis", statusREADY, has 1 handler(s) for this service...
The command completed successfully

1 認識下注冊

註冊就是將數據庫作爲一個服務註冊到監聽程序。客戶端不需要知道數據庫名和實例名,只需要知道該數據庫對外提供的服務名就可以申請連接到數據庫。這個服務名可能與實例名一樣,也有可能不一樣。

  在數據庫服務器啓動過程中,數據庫服務器會向監聽程序註冊相應的服務(無論何時啓動一個數據庫,默認地都有兩條信息註冊到監聽器中:數據庫服務器對應的實例和服務。)

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

2 靜態監聽

監聽配置中,數據庫服務中的全局數據庫名,可以寫任意內容,與數據庫無關,只要保證SID正確即可連上數據庫。

由於靜態註冊,參數是手動靜態添加,與數據庫無關。數據庫無法確認監聽是否正確配置。因此,lsnrctl中的status顯示狀態爲unkown。即不保證能連通數據庫。

注意:靜態註冊監聽,客戶端在配置tnsnames.ora服務命名時,Oracle 8i或更高版本)服務名裏填寫內容要與服務端靜態註冊監聽器時的全局數據庫名一致。否則,無法連通。

lsnrctl中顯示如下:

Service"a" has 1 instance(s).
  Instance "elvis", status UNKNOWN,has 1 handler(s) for this service...

elvis即從監聽配置過程,數據庫服務中的“全局數據庫名”讀到的值(即配置文件中GLOBAL_DBNAME的值),“elvis”是從監聽配置中,數據庫服務中的SID讀到的值(SID_NAME的值)

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = elvis)
      (ORACLE_HOME =/u01/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = elvis)
    )
  )

客戶端在配置tnsname時,服務名(SERVICE_NAME)即爲test。否則,連接不到數據庫。

ABC =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.201.128)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = elvis)
    )
  )

這裏的ABC,爲服務命名。可以爲任意值,在客戶端連接服務器時,填寫的主機字符串,即爲此服務名ABC。

3 動態註冊

3.1 缺省的動態註冊

  pmon在數據庫啓動到mount或open時,動態從參數文件中讀取service_names值。service_names可以爲多值(可以有64個,其中包括兩個系統的)。

  service_names缺省爲建立數據庫時的全局數據庫名。

  設置參數service_names爲’b,c,d’,命令如下:

  alter system set service_names=b,c,d;

  lsnrctl狀態如下:

  Service "B" has 1 instance(s).
  Instance "elvis", status READY, has1 handler(s) for this service...
Service "C" has1 instance(s).
  Instance "elvis", status READY, has1 handler(s) for this service...
Service "D" has1 instance(s).
  Instance "elvis", status READY, has1 handler(s) for this service...
Service "a" has1 instance(s).
  Instance "elvis", status UNKNOWN,has 1 handler(s) for this service...
Service "elvis"has 1 instance(s).
  Instance "elvis", status READY, has1 handler(s) for this service...
Service"elvisXDB" has 1 instance(s).
  Instance "elvis", status READY, has1 handler(s) for this service...
The command completedsuccessfully

以上服務名b,c,d,elvis都爲READY,爲動態註冊。

注意:不管參數service_names爲何值,pmon都會自動以全局數據庫名(這裏爲elvis)爲服務名,動態註冊一個監聽。

缺省情況下,若啓用動態註冊監聽,端口號必須爲1521.若啓用其他端口的動態監聽註冊,必須要做相關配置。

3.2 自定義端口的動態註冊監聽

  若要啓用非默認端口1521的動態監聽註冊,缺省狀態,Oracle不會進行動態註冊。要啓用動態註冊,必須設置local_listener參數。並在服務端配置tnsnames.ora指定監聽參數,或者直接通過修改local_listener指定監聽參數。步驟如下:

1)服務端

netmgr,配置監聽程序,監聽端口爲1525(非默認端口)


2)指定監聽參數

(1)方法1:直接通過修改local_listener參數指定

SQL>alter system set LOCAL_LISTENER=’(ADDRESS=(PROTOCOL=TCP)
(HOST=192.168.201.128)(PORT=1525))’;
SQL>alter system register

(2)方法2:

在Oracle服務器建立$ORACLE_HOME/network/admin/tnsnames.ora。解析文件,位置並填入如下內容

mytest=
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.201.128)(PORT = 1522))
   )

這裏的mytest也可以根據自己的需要,修改爲其他字符串。如a或b等。

設置參數,指定通過tnsnames.ora內的信息指定監聽參數

SQL>alter system setlocal_listener=mytest;
SQL>alter system register;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章