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

ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务

    前面的几篇博文中,我们探讨了客户端不能链接到 Oracle 数据库的各种原因。在客户端(一)那一篇中,我概要地解释了 sqlnet 将连接请求转换成网络连接描述符,并将连接请求发送给可以为此请求提供服务的监听程序的全过程。随后的两篇中,我们深入探讨了可能会造成请求不能到达服务器的各种问题。本篇中,我们将以此顺序来探讨下一个可能出现的问题。具体来说就是,ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务。

    这次演示,首先我将有意产生这个错误,然后对其进行分析并给出解决方法。之后,我们来探讨一下由此引出的几个有意义的问题。

 错误的产生:

    大多数时间,这个错误的产生原因都是因为在 tnsnames.ora 文件中指定了错误的连接描述符。我们来看一个非常典型的例子,然后分析并改正这个错误。然后来详细探讨监听程序如何才能识别一个数据库服务名。

C:\>sqlplus scott/tiger@vlnxora1

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Mar 15 18:47:26 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

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

Enter user-name:
C:\>

    显然,人们在遇到 Oracle 报错时,要做的第一件事就是 Oracle 对这个错误的官方解释。网上有很多这样的资源,但我更喜欢在服务器上使用 Oracle 提供的实用工具 oerr。

   [oracle@vmlnx01 admin]$ oerr ora 12514
12514, 00000, "TNS:listener does not currently know of service requested in connect descriptor"
// *Cause: The listener received a request to establish a connection to a
// database or other service. The connect descriptor received by the listener
// specified a service name for a service (usually a database service)
// that either has not yet dynamically registered with the listener or has
// not been statically configured for the listener. This may be a temporary
// condition such as after the listener has started, but before the database
// instance has registered with the listener.
// *Action:
// - Wait a moment and try to connect a second time.
// - Check which services are currently known by the listener by executing:
// lsnrctl services
// - Check that the SERVICE_NAME parameter in the connect descriptor of the
// net service name used specifies a service known by the listener.
// - If an easy connect naming connect identifier was used, check that
// the service name specified is a service known by the listener.
// - Check for an event in the listener.log file.

//12514,00000, “TNS:监听程序当前无法识别连接描述符中请求的服务”

//*原因:监听程序收到一个与数据库服务或其他服务建立连接的请求。监听程序

//收到的连接描述符指定了一个服务名称,其对应的服务(通常是数据库服务)尚未被动态注册到

//监听程序,或者监听程序中尚未静态配置此服务。这可能是监听刚刚启动,且数据库

//实例注册到监听程序之前所处的临时状态。

//应采取的措施;

//--等待一会儿,然后再次尝试连接。

//--执行 lsnrctl services 命令,以检查监听程序当前可以识别哪些服务。

//-- 检查网络服务名称的连接描述符部分中的 SERVICE_NAME 参数是否

//指定了一个监听能够识别的服务

//--如果使用了简易连接命名方法,直接使用连接描述符,检查指定的服务名

//是否是监听程序能够识别的服务。

//-检查 listener.ora 中的 event

 

 这个错误信息本身就已经解释的非常清楚了,“监听程序当前无法识别连接描述符中请求的服务”。那么,我们怎么才能知道“连接描述符中请求的”是什么服务呢?

 首先,来对 tnsnames.ora 进行一个合理性检查:

1. C:\>type C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\tnsnames.ora
2. vlnxora1 =
3.    (DESCRIPTION =
4.         (ADDRESS_LIST =
5.             (ADDRESS = (PROTOCOL = TCP)(HOST = vmlnx01)(PORT = 1521))
6.         )
7.         (CONNECT_DATA = (SERVICE_NAME = fubar) )
8.     )
9.
10. C:\>

    上面第7行表明,我们所请求的服务是 SERVICE_NAME = fubar。在我前面的博文的对 ORA-12154 讨论中,我解释了,为啥实际使用的 tnsnames.ora 文件并不是我们认为应该使用的那个文件。这里,我们知道了所使用的 SERVCIE_NAME 是什么。我们可以用 tnsping 来确认这一点。

1. C:\>tnsping vlnxora1
2.
3. TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-MAR-2011 19:02:39
4.
5. Copyright (c) 1997, 2007, Oracle. All rights reserved.
6.
7. Used parameter files:
8. C:\oracle\product\10.2.0\client_1\network\admin\sqlnet.ora
9.
10. Used TNSNAMES adapter to resolve the alias
11. Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
12 .(HOST = vmlnx01)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = fubar)))
13. OK (0 msec)
14.
15 .C:\>

    第12行表明,我们所请求的是一个到 fubar 的服务。但是,不要认为 tnsping 没有返回错误就一切正常。正如在我的上一篇博文(客户端(三))中所谈到的,tnsping 所能管到的,至多是确认在指定 IP 和指定端口上是否有监听。至于监听程序是否识别服务,它是管不到的。tnsping 返回的内容中有 SERVICE_NAME,纯粹是因为它返回了完整的连接描述符的缘故。

     既然知道了所请求的服务是什么,接下来我们需要检查一下监听程序识别那些服务。通过检查监听程序的配置文件 listener.ora 我们可以得到部分线索,但是并不完全。因为,即使没有 listener.ora 文件,监听程序也能够启动。能够保证明白说明监听识别那些服务唯一方法,就是使用 lsnrctl 命令直接访问监听程序。

1.  [oracle@vmlnx01 ~]$ lsnrctl status
2.
3. LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 15-MAR-2011 19:11:49
4.
5. Copyright (c) 1991, 2007, Oracle. All rights reserved.
6.
7. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
8. STATUS of the LISTENER
------------------------
9. Alias LISTENER
10. Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
11. Start Date 15-MAR-2011 18:45:24
12. Uptime 0 days 0 hr. 26 min. 25 sec
13. Trace Level off
14. Security ON: Local OS Authentication
15. SNMP OFF
16.Listener Log File /ora00/app/oracle/product/10.2.0/db_1/network/log/listener.log
17. Listening Endpoints Summary...
18.(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
19. Services Summary...
20. Service "vlnxora1" has 1 instance(s).
21. Instance "vlnxora1", status READY, has 1 handler(s) for this service...
22. Service "vlnxora1XDB" has 1 instance(s).
23.Instance "vlnxora1", status READY, has 1 handler(s) for this service...
24. Service "vlnxora1_XPT" has 1 instance(s).
25. Instance "vlnxora1", status READY, has 1 handler(s) for this service...
26. The command completed successfully
27. [oracle@vmlnx01 ~]$

     可以看出,监听程序当前识别出三个服务(vlnxora1, vlnxora1XDB, and vlnxora1_XPT)  ,而且这三个服务都和数据库实例 vlnxora1 有关系。(XDB 和 XPT 服务具有特殊用途,对当前讨论的问题来说,他们可以忽略)。大部分时候,只对这部分做调试就足够了。从这里我们知道,我们需要连接到 ‘vlnxora1’ 服务而不是 ‘fubar’ 服务。因为连接请求来自于客户端,所以我们必须修改 tnsnames.ora。

 1. C:\>type C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\tnsnames.ora
2. vlnxora1 =
3.    (DESCRIPTION =
4.        (ADDRESS_LIST =
5.            (ADDRESS = (PROTOCOL = TCP)(HOST = vmlnx01)(PORT = 1521))
6.        )
7.    (CONNECT_DATA =

8.        (SERVICE_NAME = vlnxora1)
9.    )
10. )

11. C:\>sqlplus scott/tiger@vlnxora1

12. SQL*Plus: Release 10.2.0.4.0 - Production on Tue Mar 15 19:14:41 2011

13. Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

14. Connected to:
15. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
16. With the Partitioning, OLAP, Data Mining and Real Application Testing options

18. SQL>
 

    第8行表明,我们已经对 tnsnames.ora 进行了改正。修改后的连接请求可以成功的进行。从而验证了我们的分析和所做修改的正确性。

 

向监听程序注册数据库服务:

    那么,到底怎么才能让监听程序能够识别数据库服务呢?有两种方法可以将数据库服务注册到监听程序 ---- “静态方法”和“动态方法”。下面我们依次来讨论这两种方法。

 

静态注册:

    静态注册是通过配置 listener.ora 文件中的 SID_LIST 部分来完成的。

1. [oracle@vmlnx01 admin]$ cat listener.ora
2. # listener.ora Network Configuration File: /ora00/app/oracle/product/10.2.0/db_1/network/admin/listener.ora

3. SID_LIST_LISTENER =
4.     (SID_LIST =
5.         (SID_DESC =
6.             (SID_NAME = PLSExtProc)
7.            (ORACLE_HOME = /ora00/app/oracle/product/10.2.0/db_1)
8.            (PROGRAM = extproc)
9.         )
10.        (SID_DESC =
11.            (GLOBAL_DBNAME=myfubardb)
12.            (ORACLE_HOME = /ora00/app/oracle/product/10.2.0/db_1)
13.             (SID_NAME = fubar)
14.         )
15.         (SID_DESC =
16.             (GLOBAL_DBNAME=vlnxora1)
17.            (ORACLE_HOME = /ora00/app/oracle/product/10.2.0/db_1)
18.             (SID_NAME = vlnxora1)
19.        )
20.     )

21. LISTENER =
22.     (DESCRIPTION_LIST =
23.         (DESCRIPTION =
24.             (ADDRESS = (PROTOCOL = TCP)(HOST = vmlnx01.vmdomain)(PORT = 1521))
25.            (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
26.        )
27.     )

28. [oracle@vmlnx01 admin]$

    从上面的内容中可以看到,列出了三个 SID:PLSExtProc、 fubar 和  vlnxora1 (第 8、13、18 行)。检查监听状态,我们会发现:

1.  [oracle@vmlnx01 admin]$ lsnrctl status

2. LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 18:27:25

3. Copyright (c) 1991, 2007, Oracle. All rights reserved.

4. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=vmlnx01.vmdomain)(PORT=1521)))
5. STATUS of the LISTENER
6. ------------------------
7. Alias LISTENER
8. Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
9. Start Date 16-MAR-2011 18:25:56
10. Uptime 0 days 0 hr. 1 min. 28 sec
11. Trace Level off
12. Security ON: Local OS Authentication
13. SNMP OFF
14. Listener Parameter File /ora00/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
15. Listener Log File /ora00/app/oracle/product/10.2.0/db_1/network/log/listener.log
16. Listening Endpoints Summary...
17. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
18. (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
19. Services Summary...
20. Service "PLSExtProc" has 1 instance(s).
21. Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
22. Service "myfubardb" has 1 instance(s).
23.     Instance "fubar", status UNKNOWN, has 1 handler(s) for this service...
24. Service "vlnxora1" has 2 instance(s).
25.     Instance "vlnxora1", status UNKNOWN, has 1 handler(s) for this service...
26.     Instance "vlnxora1", status READY, has 1 handler(s) for this service...
27. Service "vlnxora1XDB" has 1 instance(s).
28.     Instance "vlnxora1", status READY, has 1 handler(s) for this service...
29. Service "vlnxora1_XPT" has 1 instance(s).
30.     Instance "vlnxora1", status READY, has 1 handler(s) for this service...
31. The command completed successfully
32. [oracle@vmlnx01 admin]$

    请注意服务 “myfubardb” 这一项 (第 22 行),它对应于 listener.ora 中的 “(GLOBAL_DBNAME=myfubardb)” (第 11 行),且与其关联的数据库实例是 fubar (第 13 行)。还应该注意的是,它的状态是 UNKONWN。状态 UNKNOWN 表明,这个注册项来自于 listener.ora 的 SID_LIST 部分。其状态之所以 UNKNOWN (未知),是因为监听程序并不会进行检查,以确认是否真的有那么一个称为 fabar 的数据库实例在提供一个名为 “myfubardb” 的数据库服务。监听程序只是告诉我们说,“如果你要请求连接到 myfubardb,我会检查是否能提供此服务。”事实上,我在做以上实验时,并不存在一个名为 fubar 或 myfubardb 的数据库。

 

    还应该注意的是,服务 “vlnxora1” 关联两个数据库实例,一个状态是 UNKNOWN(未知),一个状态是 READY(就绪)。和 myfubardb 一样,状态是 UNKNOWN (未知)的实例来自于 listener.ora 文件(第 18 行)。READY (就绪)状态的实例来自于一个已经在监听上进行了注册的数据库实例(动态注册)。

 

    再次提醒,对本篇探讨的问题来说,可以忽略 vlnxora1XDB 和 vlnxora1_XTP 这两个服务。这是两个 Oracle 内部用作特殊用途的服务。
 

    本节的余下部分,我们将整个的删除 listener.ora 文件,然后重启监听程序。这样就不存在静态注册的服务,监听程序完全以默认的参数值来运行。

 

[oracle@vmlnx01 admin]$ rm listener.ora
[oracle@vmlnx01 admin]$ ls -l listener.ora
ls: listener.ora: No such file or directory

[oracle@vmlnx01 admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 18:44:43
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
The command completed successfully

 

[oracle@vmlnx01 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 18:44:49
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Starting /ora00/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Log messages written to /ora00/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date 16-MAR-2011 18:44:49
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/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
The listener supports no services
The command completed successfully

[oracle@vmlnx01 admin]$

 

     可以看到,监听程序以默认参数值启动,且没有静态注册的服务,除非有 pmon 进程将自身注册到监听程序。

 

动态注册:

 

    当数据库实例的 pmon 后台进程联系监听进程并请求注册时,就可以完成动态注册了。这是发生在数据库启动时的事儿,而且在整个数据库实例的生命期内,每隔几分钟就会进行一次。

    pmon 后台进程以什么服务名将数据库实例注册到监听程序呢?这是由三个初始化参数决定的。

    DB_NAME

    SERVCIE_NAMES

    DB_DOMAIN

    我们应该读读 Oracle 的 Reference Manual (参考手册),看看官方文档中是如何描述这些参数的。其中对 SERVICE_NAMES 参数的描述如下:

    If you do not qualify the names in this parameter with a domain, Oracle qualifies them with the value of the DB_DOMAIN parameter. If DB_DOMAIN is not specified, then no domain will be applied to the non-qualified SERVICE_NAMES values.

    (如果此参数中的名称未用域名来限定,Oracle 会用 DB_DOMAIN 参数的值来限定。如果未指定 DB_DOMAIN,那么非限定的 SERVICE_NAMES 值上不会添加域名。 )

    还有一种说法在 Reference Manual 中没有给出,但在 《Net Services Administrator’s Guide》中有:

    The service name defaults to the global database name, a name comprising the database name (DB_NAME parameter) and domain name (DB_DOMAIN parameter)

    (服务名默认取全局数据库名,全局数据库名是由数据库名(DB_NAME 参数)和域名(DB_DOMAIN 参数)组成的。)

    因为这两个参数都不是必选参数,那么我们就从一个这两个参数都未设置的数据库实例开始。然后我们来修改相关设置,来看看服务名称是如何构造的。对每种设置,我们会按如下顺序实验:

    1)修改初始化参数。

    2)重启数据库。(某些参数需要,为了保持一致性,在所有的实验中,我都将重启。)

    3)重启监听程序,以清楚原有的注册上来的服务。

    4)强制重新注册。

    5)显示监听程序的状态,以查看重新注册的结果。

    6)显示以上三个参数的值,以便比较。

 

[oracle@vmlnx01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Mar 16 19:17:57 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter system set service_names='' scope=spfile;
System altered.

SQL> alter system set db_domain='' scope=spfile;
System altered.

SQL> @doit

SQL> startup force
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1267068 bytes
Variable Size 138414724 bytes
Database Buffers 142606336 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.

SQL> !lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 19:18:52
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
The command completed successfully

SQL> !lsnrctl start
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 19:19:01
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Starting /ora00/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Log messages written to /ora00/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date 16-MAR-2011 19:19:01
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/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
The listener supports no services
The command completed successfully

SQL> alter system register;
System altered.

SQL> !lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 19:19:01
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date 16-MAR-2011 19:19:01
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/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
Services Summary...
Service "vlnxora1" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1XDB" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1_XPT" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
The command completed successfully

SQL> show parameter db_name;

NAME                                      TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_name                               string      vlnxora1

 

SQL> show parameter service_names;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
service_names                     string

 

SQL> show parameter db_domain;

NAME                                       TYPE       VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string

SQL>

    从以上飘红的行可以看出,有三个服务。三个服务都和实例 “vlnxora1” 想关联,且其服务名称来源于初始化参数 DB_NAME。

    下面的实验中,我们添加一个简单的服务名(service name)。通常的做法是,把这个参数设置成和 DB_NAME 一样的值,但为了跟踪修改参数的结果,我们故意将其设置成一个不同的值。需要特别注意的是,将 service_names 设置成多个值,也是可以的。后面我们谈到这一点。

SQL> alter system set service_names='edstevens' scope=spfile;

System altered.

SQL> @doit
---- snip repetitive commands and output ----
SQL> !lsnrctl status

LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 19:22:06

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date 16-MAR-2011 19:22:06
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/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
Services Summary...
Service "edstevens" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1XDB" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1_XPT" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
The command completed successfully

SQL> show parameter db_name;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
db_name                               string       vlnxora1

 

SQL> show parameter service_names;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
service_names                     string      edstevens

 

SQL> show parameter db_domain;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string
SQL>

   

     可以看到,原来存在的所有来自于 DB_NAME 的服务还都在。但是,多出了一个来源于 SERVICE_NAMES 的服务 "edstevens"。

     下面,我们再把 DB_DOMAIN 参数加上:

SQL> alter system set db_domain='acme.com' scope=spfile;
System altered.

SQL> @doit
---- snip repetitive commands and output ----

SQL> !lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 19:24:01
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date 16-MAR-2011 19:24:01
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/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
Services Summary...
Service "edstevens.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1XDB.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1_XPT.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
The command completed successfully

SQL> show parameter db_name;

NAME                 TYPE                          VALUE
------------------------------------ ----------- ------------------------------
db_name           string                           vlnxora1

SQL> show parameter service_names;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
service_names                     string       edstevens

SQL> show parameter db_domain;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string      acme.com

SQL>

   

    我们注意到,所有的服务名,不管是来源于 DB_NAME 的服务名还是来源于 SERVICE_NAMES 的服务名,都添加了一个 DB_DOMAIN 后缀。

    下面我们再添加一个服务名,这个服务名是已经用域名做了限定的。通常我们不会这么做,但这对我们演示参数的作用还是有用的。

 

SQL> alter system set service_names='edstevens,wiley.coyote.com' scope=spfile;
System altered.

SQL> @doit
---- snip repetitive commands and output ----

SQL> !lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 16-MAR-2011 19:27:07
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date 16-MAR-2011 19:27:07
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/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vmlnx01.vmdomain)(PORT=1521)))
Services Summary...
Service "edstevens.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1XDB.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "vlnxora1_XPT.acme.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
Service "wiley.coyote.com" has 1 instance(s).
Instance "vlnxora1", status READY, has 1 handler(s) for this service...
The command completed successfully

SQL> show parameter db_name;

NAME                                      TYPE       VALUE
------------------------------------ ----------- ------------------------------
db_name                                string       vlnxora1

SQL> show parameter service_names;

NAME                                      TYPE       VALUE
------------------------------------ ----------- ------------------------------
service_names                     string     edstevens,wiley.coyote.com

SQL> show parameter db_domain;

NAME                                      TYPE      VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string      acme.com

SQL>

   

    和上面类似,所有来源于 DB_NAME 和 SERVICE_NAMES 的未限定的服务名都用 DB_DOMAIN 做了限定。但是,多了一个来源于 SERVICE_NAMES 的第二个值的服务名。因为 SERVCIE_NAMES 的第二个值是完全限定的,因此这个值上并未添加 DB_DOMAIN 值。

 

    结论

 

     本文探讨了客户端的连接描述符和服务器端的监听程序所支持的服务之间的关系,以及控制监听能够支持那些服务的各种因素。下一篇中,我们来探讨数据库实例是如何找到监听程序,并注册到此监听程序的,主要探讨初始化参数 LOCAL_LISTENER。

 

       原文地址:https://edstevensdba.wordpress.com/2011/03/19/ora-12514/ (可能被墙)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值