官术网_书友最值得收藏!

  • Oracle DBA基礎教程
  • 林樹澤
  • 3469字
  • 2021-03-26 13:21:40

3.2 服務器端監聽器配置

無論是共享服務器連接還是專有服務器連接,數據庫服務器端必須啟動監聽程序。本節我們介紹數據庫服務器端的監聽配置,以及如何實現動態注冊和靜態注冊數據庫。

監聽程序即Oracle Net Service服務,由一個Oracle文件管理,該文件名為listener.ora,該文件在Linux系統上默認位于$ORACL_HOME/network/admin目錄下。Oracle的監聽程序只運行在數據庫服務器上,完成監聽客戶連接請求的作用。Oracle使用lsnrctl實用程序完成監聽程序的配置和管理。

監聽文件包含監聽程序的配置信息,如下是一個簡單的監聽程序配置。

例子3-1 監聽程序配置

    LISTENER=
       (DESCRIPTION_LIST=
          (DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521))
          )
       )

監聽器LISTNER使用的協議為TCP ,HOST為ocm1.oracle,端口是1521(默認端口),該監聽器為啟動監聽的默認監聽器,即如果不具體指定啟動那個監聽,則默認啟動名為LISTNER的監聽器,當然也可以配置一個其他名字的監聽器,端口也可以不同。如下例所示,我們添加一個監聽器LISTENER1。

例子3-2 添加一個監聽器

    LISTENER=
       (DESCRIPTION_LIST=
          (DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521))
          )
       )
    LISTENER1=
       (DESCRIPTION_LIST=
          (DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1522))
          )
       )

Listener.ora文件配置完成之后,使用lsnrctl指令啟動監聽,并查看監聽狀態,如例子3-3所示。

例子3-3 啟動監聽LISTNER1

    [Oracle@ocm1 admin]$ lsnrctl start listener1;
    
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 09:31:13
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    Starting /u01/app/Oracle/Oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
    
    TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    System parameter file is /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Log messages written to /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener1.log
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1522)))
    
    Connecting to 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1522)))
    STATUS of the LISTENER
    ------------------------
    Alias                     listener1
    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date                24-OCT-2011 09:31:13
    Uptime                    0 days 0 hr. 0 min. 0 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Listener Log File         /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener1.log
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1522)))
    The listener supports no services
    The command completed successfully

注意,此時我們只啟動了監聽LISTENER1,但是沒有任何服務注冊到該監聽,監聽器LISTNER也是如此。

下面我們查看監聽器LISNTER1的狀態信息,看是否有服務注冊過來。

例子3-4 查看監聽器的狀態信息

    [Oracle@ocm1 admin]$ lsnrctl status listener1 
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 09:40:29
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    Connecting to 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1522)))
    STATUS of the LISTENER
    ------------------------
    Alias                     listener1
    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date                24-OCT-2011 09:31:13
    Uptime                    0 days 0 hr. 9 min. 15 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Listener Log File         /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener1.log
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1522)))
    The listener supports no services
    The command completed successfully

顯然此時,沒有任何服務注冊在該服務器上,客戶端無法連接到該服務器。此時沒有涉及服務名的問題,只有客戶端在將服務名傳給監聽器以后,監聽器經過處理才能建立客戶端到數據庫服務器的連接。下面我們分別介紹動態注冊和靜態注冊的概念。

3.2.1 動態注冊

數據庫實例里的PMON進程,將當前實例的服務名注冊到同一臺服務器上,默認在1521端口上監聽的監聽器(就是名為LISTENER的監聽器),當前實例的服務名由初始化參數service_name決定。我們首先查看當前數據庫的服務名信息,如下例所示。

例子3-5 查看數據庫的服務信息

    SQL> show parameter service_name
    
    NAME                TYPE                  VALUE
    -------------------------------- ------------------------------- -----------------------------
    service_names          string                   PROD

顯示當前的數據庫服務器的service_name為PROD。接下來手工完成動態注冊,參數local_listener控制動態注冊到的監聽器,也就是決定將數據庫動態注冊到哪個監聽器。

我們查看當前該參數的值如下例所示。

例子3-6 查看當前參數的值

    SQL> show parameter local_listener;
    
    NAME                    TYPE                             VALUE
    ------------------------------------ -------------------------------- ------------------------------
    local_listener                  string

我們發現,當前該參數的值為空,沒有設置動態注冊的監聽器的信息。我們設計將數據庫PROD動態注冊到監聽器LISTENER1。下面在沒有配置local_listener參數之前,我們再次確定監聽器LISTERER1的狀態信息。

例子3-7 確定LISTERI的狀態信息

    [Oracle@ocm1 admin]$ lsnrctl status listener1
    
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 09:54:12
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1522)))
    STATUS of the LISTENER
    ------------------------
    Alias                     listener1
    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date                24-OCT-2011 09:31:13
    Uptime                    0 days 0 hr. 22 min. 59 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Listener Log File         /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener1.log
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1522)))
    The listener supports no services
    The command completed successfully

此時,依然沒有任何服務注冊過來。下面我們設置參數local_listener,告訴數據庫PROD要動態注冊到監聽器LISTENER1,如下例所示。

例子3-8 設置參數local_listener

    SQL> alter system set 
    local_listener='(address_list=(address=(protocol=tcp)(host=192.168.1.10)(port=1522)))';
    
    System altered.

此時必須正確填寫監聽器LISTENER的信息,包括使用協議、監聽器所在主機地址和使用的監聽端口。因為是“動態注冊”,所以不需要重啟監聽LISTENER1,該服務PROD就自動注冊到監聽器LISTENER1上去。下面我們查詢LISTENER1的狀態,如下例所示。

例子3-9 查詢LISTENER的狀態

    [Oracle@ocm1 admin]$ lsnrctl status listener1
    
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 10:00:50
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1522)))
    STATUS of the LISTENER
    ------------------------
    Alias                     listener1
    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date                24-OCT-2011 09:31:13
    Uptime                    0 days 0 hr. 29 min. 36 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Listener Log File         /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener1.log
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1522)))
    Services Summary...
    Service "PROD" has 1 instance(s).
      Instance "PROD", status READY, has 1 handler(s) for this service...
    Service "PROD_XPT" has 1 instance(s).
      Instance "PROD", status READY, has 1 handler(s) for this service...
    The command completed successfully

通過Service Summary我們知道,服務PROD已經注冊到了監聽器LISTENER1。下面我們通過一個連接測試注冊信息。

3.2.2 靜態注冊

靜態注冊是將數據庫的信息直接注冊到監聽器配置文件中,這樣只要監聽啟動就會靜態注冊該服務,這里“靜態”的含義是必須重啟監聽器該注冊才有效,這個概念類似Oracle的“靜態”與“動態”參數的含義。下面是一個靜態注冊的例子,我們將數據庫PROD注冊到默認監聽器LISTENER。此時需要修改listener.ora文件,修改后的文件內容如下例所示。

例子3-10 修改listener.ora文件

    LISTENER=
       (DESCRIPTION_LIST=
          (DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521))
          )
       )
    LISTENER1=
       (DESCRIPTION_LIST=
          (DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1522))
          )
       )
    SID_LIST_LISTENER=
       (SID_LIST=
          (SID_DESC=
               (SID_NAME=PROD)
               (Oracle_HOME=/u01/app/Oracle/Oracle/product/10.2.0/db_1)
               (GLOBAL_DBNAME=PROD)
          )
       )

將數據庫PROD注冊到監聽器LISTENER,此時使用靜態注冊直接在listener.ora文件中注冊該數據庫。這里需要SID_NAME、Oracle_HOME和GLOBAL_DBNAME三個參數。

完成靜態注冊的內容修改后,我們暫時不重啟監聽器LISTENER。看數據庫PROD服務是否注冊到了監聽器LISTENER,如下例所示。

例子3-11 查詢數據庫PROD服務是否注冊到監聽器listener

    [Oracle@ocm1 admin]$ lsnrctl status listener
    
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 10:12:41
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    Connecting to 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date                24-OCT-2011 09:39:54
    Uptime                    0 days 0 hr. 32 min. 47 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Listener Log File         /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener.log
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1521)))
    The listener supports no services
    The command completed successfully

顯然,沒有任何服務注冊過來,下面我們重啟該監聽。先關閉LISTENER,然后啟動監聽,此時新的監聽文件內容生效。接下來查詢數據庫PROD服務是否靜態注冊到監聽器LISTENER。

例子3-12 查詢數據庫服務PROD是否靜態注冊到監聽器LISTENER

    [Oracle@ocm1 admin]$ lsnrctl status listener
    
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 10:14:10
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     listener
    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date                24-OCT-2011 10:13:48
    Uptime                    0 days 0 hr. 0 min. 21 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Listener Log File         /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/log/listener.log
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle)(PORT=1521)))
    Services Summary...
    Service "PROD" has 1 instance(s).
      Instance "PROD", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully

顯然,從Services Summary...數據庫服務PROD靜態注冊到了監聽器LISTENER。“Instance "PROD", status UNKNOWN”說明這是一個靜態注冊。

3.2.3 連接測試

當我們使用SQL*PLUS從客戶端連接到數據庫服務器時,雖然監聽已經啟動,并且完成了靜態注冊和動態注冊,但是作為客戶端還必須有自己的配置,這里我們不詳細介紹,只是給出一個例子,演示我們監聽器靜態和動態注冊的結果。

在客戶端需要修改tnsnames.ora文件,將客戶端的服務名和監聽器服務名之間建立映射關系,并告訴客戶端軟件要連接到數據庫服務器的實體信息,這些信息包括通信協議、數據庫服務器主機地址以及使用連接端口等。下例是tnsnames.ora文件的配置信息。

例子3-13 tnsnames.ora文件的配置信息

    MYPROD =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = ocm1.oracle)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = PROD)
        )
      )

下面測試客戶端到監聽器是否暢通,使用tnsping指令,如下例所示。

例子3-14 測試客戶端到監聽器是否暢通

    [Oracle@ocm1 admin]$ tnsping myprod
    
    TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 10:26:01
    
    Copyright (c) 1997, 2005, Oracle.  All rights reserved.
    
    Used parameter files:
    
    
    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = 
    TCP)(HOST = ocm1.oracle)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) 
    (SERVICE_NAME = PROD)))
    OK (30 msec)

顯然此時客戶端到監聽器之間是暢通的,但是還不能保證到數據庫PROD的連接一定成功,因為如果數據庫沒有啟動,而只是啟動了監聽,此時一樣可以PING通。接下來我們使用SQL*PLUS指令測試到數據庫服務器的連接是否成功,如下例所示。

例子3-15 測試連接是否成功

    [Oracle@ocm1 admin]$ sqlplus sys/Oracle@myprod as sysdba
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 24 10:36:15 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, Oracle Label Security, OLAP and Data Mining options
    
    SQL>

顯然,此時連接成功,客戶端成功建立到數據庫PROD的連接。接下來我們將更詳細介紹客戶端的配置以及幾種客戶端連接數據庫的方法。

3.2.4 監聽程序管理

Oracle使用lsnrctl實用程序來管理和維護監聽,如通過status指令查詢監聽狀態信息,通過service指令查看監聽為連接請求監控的服務內容等。而更多的指令,我們可以通過help指令查看,如下例所示。

例子3-16 通過help指令查看更多指令

    [Oracle@ocm1 admin]$ lsnrctl help;
    
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-OCT-2011 10:46:47
    
    Copyright (c) 1991, 2005, Oracle.  All rights reserved.
    
    The following operations are available
    An asterisk (*) denotes a modifier or extended command:
    
    start               stop                status
    services            version             reload
    save_config         trace               spawn
    change_password     quit                exit
    set*                show*

下面解釋常用的幾個指令。

● Lsnrctl start:啟動監聽程序,默認啟動名為LISTENER的監聽程序,如果不是默認監聽則需要制定啟動的監聽器名字,如lsnrctl start lsnr2。

● Lsnrctl stop:關閉監聽程序,默認啟動名為LISTENER的監聽程序,如果不是默認監聽則需要制定關閉的監聽器名字,如lsnrctl stop lsnr2。

● Lsnrctl service:查看監聽為連接請求監控的服務內容。

● Lsnrctl reload:允許重載監聽程序,如監聽文件更改,可以使用該指令使得修改生效,在重載過程中已經建立連接的客戶端繼續保持連接。

● Lsnrctl set:設置監聽管理密碼,防止未授權而操作監聽器。

下面我們給出設置監聽程序管理的幾個例子。

● 多監聽設置。在一個服務器上可以運行多個監聽程序,在RAC環境下比較普遍,此時往往需要設置CONNECT_TIME_FAILOVER參數,其含義是在客戶機使用新的監聽程序建立連接前需要等待通過當前監聽程序連接的時間長度。

● 設置隊列長度。如果有大量客戶請求連接往往使得監聽程序無法提供足夠的連接資源,此時發生監聽程序失敗難以避免,為了控制客戶連接到監聽器的數量,在監聽器文件中設置queuesize參數,告訴監聽器可以為多少個連接提供并發服務。如下例所示。

例子3-17 在監聽文件中設置queuesize參數

    LISTENER=
       (DESCRIPTION_LIST=
          (DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)(QUEUESIZE=5)
          )
       )

● 設置監聽程序密碼。因為在設置監聽程序時,默認是沒有保護密碼的,這就給監聽的管理帶來混亂,因為任何進入操作系統的人都可以操作監聽器,這樣對于安全管理顯然不利。設置監聽程序密碼如下例所示。

例子3-18 設置監聽程序密碼

    LSNRCTL> set password
    Password:
    The command completed successfully
    LSNRCTL> change_password
    Old password:
    New password:
    Reenter new password:
    Connecting to 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)))
    Password changed for LISTENER
    The command completed successfully
    LSNRCTL> save_config
    Connecting to 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)))
    Saved LISTENER configuration parameters.
    Listener Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.ora
    Old Parameter File   /u01/app/Oracle/Oracle/product/10.2.0/db_1/network/admin/listener.bak
    The command completed successfully

這樣一來,在啟動和關閉監聽時,就需要使用密碼來完成,顯然增強了監聽管理的安全性。

主站蜘蛛池模板: 襄垣县| 嵊泗县| 九江市| 南雄市| 麻栗坡县| 碌曲县| 利辛县| 贡山| 衡水市| 香河县| 临桂县| 武义县| 琼中| 苍溪县| 红安县| 朔州市| 思茅市| 龙南县| 农安县| 连山| 五河县| 连山| 广水市| 同仁县| 六安市| 观塘区| 昌都县| 宜春市| 瑞丽市| 绥化市| 襄城县| 阿坝县| 横山县| 工布江达县| 和平区| 邻水| 隆昌县| 宁夏| 江北区| 惠水县| 巫山县|