Orlace 数据库连接的那些事儿:服务器端(二)

关于初始化参数 LOCAL_LISTENER

    在上一篇关于 ora-12514 的讲解中,我曾经提到初始化参数 LOCAL_LISTENER 在将数据库动态注册到监听程序时所起的作用。本篇中,我们将对这个参数进行深入探讨。

    首先来快速的回顾一下上一篇的内容:监听程序有两种方法可以感知数据库实例的存在,用 Oracle 术语来说,这个过程被称为“注册到监听程序”。   

 

静态实例注册

    第一个、老的方法是静态注册。这个方法中,数据库实例在监听配置文件 listener.ora 的 SID_LIST 部分列出。这类注册以如下方式出现在 listener.ora 中:

[oracle@lnxsrv01 admin]$ cat listener.ora

SID_LIST_LISTENER =
    (SID_LIST =
        (SID_DESC =
            (SID_NAME = PLSExtProc)
            (ORACLE_HOME = /ora00/app/oracle/product/11.2.0/db_1)
            (PROGRAM = extproc)
        )
        (SID_DESC =
            (GLOBAL_DBNAME=OKLACITY)
            (ORACLE_HOME = /ora00/app/oracle/product/11.2.0/db_1)
            (SID_NAME = OKLACITY)
        )
    )

LISTENER =
    (DESCRIPTION_LIST =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)(HOST = lnxsrv01.vmdomain)(PORT = 1521))
            (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
        )
    )

[oracle@lnxsrv01 admin]$

    静态注册的实例在监听状态中显示为 UNKNOWN (位置)状态。

[oracle@lnxsrv01 admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:20:48

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:20:42
Uptime 0 days 0 hr. 0 min. 5 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "OKLACITY" has 1 instance(s).
Instance "OKLACITY", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@lnxsrv01 admin]$

    其状态之所以为 UNKNOWN (未知),是因为没有确保相关数据库实例真正存在的机制。当监听程序接收到连接请求是,简单的认为相关实例是存在的。事实上,当我用上述命令查看监听状态时,数据库是当掉的。

 

动态实例注册

    Oracle 9 引入了动态注册的概念。有了动态注册,相关数据库实例就不在需要在 listener.ora 中列出,而是由数据库实例直接联系监听程序,并向监听程序注册。我们可以通过监控监听程序的状态来查看动态注册的结果。以下实验中,我们首先通过将 listener.ora 改名来“删除”这个文件,再重启监听程序,然后看看监听处于什么状态。实际上,即使没有 listener.ora 文件,监听程序也是可以启动的。只不过是,启动后它是以全部默认参数值在运行。

 [oracle@lnxsrv01 admin]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:21:56
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1521)))
The command completed successfully

[oracle@lnxsrv01 admin]$ mv listener.ora listener.sav

[oracle@lnxsrv01 admin]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:22:26
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Starting /ora00/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Log messages written to /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1521)))
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:22:26
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1521)))
The listener supports no services
The command completed successfully

[oracle@lnxsrv01 admin]$

    我们看到,监听程序已经启动了,但它还不能识别任何服务。如果我们现在尝试连接,它将返回 ora-12514 错误。

C:\>tnsping oklacity

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 28-JUL-2
011 20:23:43

Copyright (c) 1997, 2010, Oracle. All rights reserved.

Used parameter files:
C:\app\oracle\product\11.2.0\client_1\network\admin\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = lnxsrv01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = OKLACITY)))
OK (20 msec)

C:\>sqlplus scott/tiger@oklacity

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jul 28 20:23:53 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor

  

    上面的 tnsping 输出结果表明,tnsnames 解析这部分没有问题。但从 sqlplus 的输出结果来看,但我们试图连接到数据库服务时,监听程序告诉我们它还不能识别数据库服务 ‘OKLACITY’。

    我们来启动数据库看一下:

[oracle@lnxsrv01 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Thu Jul 28 20:25:31 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 849530880 bytes
Fixed Size 1347480 bytes
Variable Size 637534312 bytes
Database Buffers 205520896 bytes
Redo Buffers 5128192 bytes
Database mounted.
Database opened.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

[oracle@lnxsrv01 admin]$

[oracle@lnxsrv01 admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:26:38

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:22:26
Uptime 0 days 0 hr. 4 min. 12 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1521)))
Services Summary...
Service "OKLACITY" has 1 instance(s).
Instance "OKLACITY", status READY, has 1 handler(s) for this service...
Service "OKLACITYXDB" has 1 instance(s).
Instance "OKLACITY", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@lnxsrv01 admin]$

    从上面的输出结果可以看出,一旦数据库实例启动了,再查看监听时就会发现,它已经能够识别服务 OKLACITY 了,并且其状态是 READY(就绪)。这个结果当然不是出自于 listener.ora,因为我已经将这个文件“删除”了。还有不同于静态注册一点是,这个实例的状态是 READY (就绪),而不是 UNKNOWN(未知)。监听程序所以能够知道数据实例已就绪,是因为数据库实例通知了监听程序其已就绪。我们可以通过对数据库做一个远程连接来验证这一点。

C:\>sqlplus scott/tiger@oklacity

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jul 28 20:26:49 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

    (译注:以上说明,如果所有参数都使用默认值,动态注册是没有问题的。)

 

初始化参数 LOCAL_LISTENER

 

    由此可知,即使没有 listener.ora 这个配置文件,监听程序也可以正常启动,并可以成功处理连接请求。这是由于监听程序的所有参数都是用默认值,而且数据库能够注册到监听的缘故。

    数据库实例怎么才能知道如何找到监听程序,并向其注册呢?答案是使用初始化参数 LOCAL_LISTENER。Oracle database 11G 的文档是这样写的:

    LOCAL_LISTENER 指定一个网络名,这个网络名可以一个或多个 Oracle Net 本地监听的地址。

    先来看看我的数据库实例中的这个参数:

SQL> show parameter local_listener

NAME                                       TYPE     VALUE
------------------------------------ ----------- ------------------------------
local_listener                         string

SQL>

 

    OK,数据库实例应该使用 LOCAL_LISTENER 来找到监听程序,这样才能向监听程序注册。但是,我的 LOCAL_LISTENER 参数根本没有值。实际情况是,LOCAL_LISTENER 参数有一个默认值,这个默认值可以和监听程序的默认配置完美结合。再来看看官方文档,它是这样说的:

    默认值是 (ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521)),其中 hostname 是本地主机的网络名称。  

   (译注:同学们!这会儿知道为什么把监听地址从机器名改成 IP 地址实例就不能动态注册了吧?原因在这里。)

    我实在找不到理由让监听程序不使用默认的名称和端口,但也确实有人坚持这么做,这时候就需要修改 LOCAL_LISTENER 参数,使之与监听程序所使用的实际参数相匹配。我们来建立一个实验环境。

    首先,我把监听设置成使用非默认端口。注意,我已经从 listener.ora 文件中完全删除了 SID_LIST 部分。

   

[oracle@lnxsrv01 admin]$ cat listener.ora
LISTENER =
    (DESCRIPTION_LIST =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)(HOST = lnxsrv01.vmdomain)(PORT = 1522))
            (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
        )
    )

[oracle@lnxsrv01 admin]$ lsnrctl start

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:30:53

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Starting /ora00/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.2.0 - Production
System parameter file is /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:30:53
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
The listener supports no services
The command completed successfully

oracle@lnxsrv01 admin]$

 

     这时,监听已经启动,而且在非默认端口 1521 上监听,且不识别任何数据库服务。如果是默认设置,现在应该可以连接到数据库并强制注册。但是现在,监听程序使用非默认端口 1522 监听,而数据库实例却试图联系在默认端口 1521 上的监听。

 [oracle@lnxsrv01 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Thu Jul 28 20:31:50 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter system register;

System altered.

SQL>
  

    本来期望返回错误,但实际上并没有错误返回。而且 alert 日志里面也没有相关的错误信息。但是正如所预料的,数据库实例并没有注册到监听程序。

[oracle@lnxsrv01 admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:32:45

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:30:53
Uptime 0 days 0 hr. 1 min. 52 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
The listener supports no services
The command completed successfully

[oracle@lnxsrv01 admin]$

 

     要让数据库实例能够注册到使用了非默认参数值的监听程序上,我们需要相应的修改 LOCAL_LISTENER 的值。还记得文档中是怎么描述 LOCAL_LISTENER 的吗?LOCAL_LISTENER 指定的是可以解析成 Oracle Net 的本地监听程序的一个或多个监听地址的网络名称。所以我们按此来设置:

[oracle@lnxsrv01 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Thu Jul 28 20:33:23 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL=TCP)(HOST=lnxsrv01)(PORT=1522))' scope=both;

System altered.

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

[oracle@lnxsrv01 admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:34:12

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:30:53
Uptime 0 days 0 hr. 3 min. 19 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "OKLACITY" has 1 instance(s).
Instance "OKLACITY", status READY, has 1 handler(s) for this service...
Service "OKLACITYXDB" has 1 instance(s).
Instance "OKLACITY", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@lnxsrv01 admin]$

    通过将 LOCAL_LISTENER 参数设置成与监听程序的参数相应的值,数据库实例就又能找到监听程序并向其注册自己了。

 

     有没有发现 LOCAL_LISTENER 的值与 tnsnames.ora 文件中的某一项网络名称类似?还记得文档中对 LOCAL_LISTENER 的描述吗?它指定了可以解析成地址的网络名。事实上,我们真的可以使用 tnsnames 定义的名称来代替 LOCAL_LISTENER 参数中的网络协议、网络地址、端口这一套东西。要达到这个目的,我们需要在服务器上的 tnsnames.ora 文件中专门创建一个网络名称,然后设置 LOCAL_LISTENER 指向这个网络名称。与 tnsnames 中普通网络名称指向数据库服务不同,这个特殊的网络名称指向监听程序本身。(顺便提一下,通常认为只有客户端进程才使用 tnsnames.ora 文件。数据库实例对 tnsnames 的这种用法也不例外。此时,数据库实例的扮演的是客户端的角色。就像一个数据库实例使用 DB link 访问另外一个数据库一样。

 

    我们来创建一个 tnsnames 名称,用 tnsping 对其进行测试。添加的名称为 FUBAR。

 

[oracle@lnxsrv01 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: $ORACLE_HOME/network/admin

FUBAR =
    (DESCRIPTION =
        (ADDRESS_LIST =
           (ADDRESS = (PROTOCOL = TCP)(HOST = lnxsrv01.vmdomain)(PORT = 1522))
        )
    )

OKLACITY =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = lnxsrv01.vmdomain)(PORT = 1522))
        )
        (CONNECT_DATA =
            (SERVICE_NAME = OKLACITY)
        )
    )
[oracle@lnxsrv01 admin]$ tnsping fubar

TNS Ping Utility for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:37:00

Copyright (c) 1997, 2010, Oracle. All rights reserved.

Used parameter files:

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = lnxsrv01.vmdomain)(PORT = 1522))))
OK (10 msec)

[oracle@lnxsrv01 admin]$

   

 

 

    实际应用中,我本会为 tnsnames 别名取一个更有意义的名称(比如数据库服务名:译注),但这里为了实验,我选取了一个明显不同于保留字或默认值的名字。应该注意的是,由于 FUBAR 是用来定位监听程序本身(而不是数据库实例的服务),因此不需要包含 CONNECT_DATA 部分。

    既然有了专门用来指向监听程序的 tnsnames 名称,我们就来验证一下.

    首先,我们来设置 LOCAL_LISTENER 使用 tnsnames.ora 中的名称。

[oracle@lnxsrv01 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Thu Jul 28 20:40:03 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter system set local_listener='FUBAR' scope=both;

System altered.

SQL> show parameter local_listener

NAME                                      TYPE     VALUE
------------------------------------ ----------- ------------------------------
local_listener                         string      FUBAR
SQL>

    下面,我们重启监听,以便清除原来已有的注册信息,然后再启动监听:

 

SQL> !lsnrctl stop

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:41:19

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
The command completed successfully

SQL>
SQL> !lsnrctl start

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:41:48

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Starting /ora00/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.2.0 - Production
System parameter file is /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:41:48
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
The listener supports no services
The command completed successfully

    最后,我们来强制注册数据库实例到监听,然后查看监听状态。

SQL> alter system register;

System altered.

SQL>
SQL> !lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 28-JUL-2011 20:42:49

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 28-JUL-2011 20:41:48
Uptime 0 days 0 hr. 1 min. 1 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /ora00/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /ora00/app/oracle/diag/tnslsnr/lnxsrv01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lnxsrv01.vmdomain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "OKLACITY" has 1 instance(s).
Instance "OKLACITY", status READY, has 1 handler(s) for this service...
Service "OKLACITYXDB" has 1 instance(s).
Instance "OKLACITY", status READY, has 1 handler(s) for this service...
The command completed successfully

SQL>

结论

    本篇,我们演示了监听程序不使用 listener.ora 配置文件也能正常运行。演示了数据库实例使用默认值和非默认值注册到监听程序的方法,演示了数据库实例是如何使用初始化参数 LOCAL_LISTENER 和 tnsnames.ora 文件 定位监听程序并注册的。

    到此为止,我们已经讨论了可能引起 Oracle 数据库连接问题的差不多所有的 TNS 配置条目。前面的帖子中,我们覆盖了一个完整的“配置链”,从最初的客户端连接请求,到网络路由,到监听,最后到数据库实例。本篇,探讨的是,怎样才能使得监听程序知道为那些数据库实例提供服务的问题。希望这几篇文章能够解决大家遇到的数据库连接问题。

 

    原文地址:https://edstevensdba.wordpress.com/2011/07/30/exploring-the-local_listener-parameter/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值