Oracle DBA基础教程
上QQ阅读APP看书,第一时间看更新

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

这样一来,在启动和关闭监听时,就需要使用密码来完成,显然增强了监听管理的安全性。