`
mikixiyou
  • 浏览: 1100497 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353620
社区版块
存档分类
最新评论

监听器注册与ORA-12514 错误分析

阅读更多

在Oracle data guard环境中,主库的alert.log文件出现"ORA-12514: TNS:listener does not currently know of service requested in connect descriptor"错误信息,导致主库上的日志无法传输到备库上,data guard数据同步不能实现。
这是一个最最基础的错误,在我们最初从客户端连接Oracle数据库时就可能碰到这个错误。
在主库上使用tnsping 这个oracle net服务别名,如下所示:

 

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.90)(PORT = 1844))) (CONNECT_DATA = (SERVICE_NAME = webdb)))
OK (0 msec)

 
据此信息可以判断,数据库服务器上的监听器正常,客户端与数据库服务器的网络通讯正常,请求的端口184正常。问题仅仅是监听器不识别在连接符中提供的服务。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1718387 )

问题分析

 

主库上请求连接备库的服务名webdb,在备库上不能被监听器识别。
在备库上,服务名webdb既没有被监听器动态注册,也没有静态配置在监听器配置文件listener.ora中。
这里解释一下注册的概念。 
我个人理解,注册就是将数据库实例作为一个服务写到到监听程序的监控列表中。
客户端连接数据库时,可以通过这个服务名直接申请到对应的数据库连接,而不再通过数据库实例或者数据库名称。这样客户端也就可以不用知道数据库实例和数据库名称。虽然服务名一般和实例名是一样的,但有这个功能后就可以不一样。

在数据库实例启动过程中,数据库实例严格地说是PMON进程会向监听器注册相应的服务。这个过程称为动态注册。
监听器程序在服务注册后,就记录了服务名和实例名之间的对应关系。从而使得客户端使用服务名访问时能从服务名可以转换到实例名。一个服务名下可以包含多个不同的实例名称,如RAC的下服务名;同样,一个实例名下,可以有多个不同服务名。服务名和实例名的对应关系PMON进程从数据库初始化参数service_names和instances中获取。
在服务名注册到监听器之后,客户端只需要通过服务名就能访问某个实例。在RAC下,这个服务名可以用来实现负载均衡和透明故障切换。
如果这时客户端还是使用实例名访问数据库,那么就不能实现RAC下的负载均衡和故障透明切换。
但是,动态注册不一定时时都生效的。如ORA-12514就是动态注册不生效,导致监听器无法识别客户端连接符中提供的服务名,从而拒绝建立数据库连接时报的错误信息。
动态注册默认仅仅注册到默认的监听器上,这个默认值有三项指标:名称是LISTENER、端口是1521、协议是TCP。如果需要向非默认监听注册,则需要配置local_listener参数。
使用tnsping得到的信息显示,监听器使用的端口号是1844,不是默认选项。因此,该服务名并没有被自动注册进入到监听器。
将这个服务注册进入监听器的方法还有一种,称之为静态注册。
静态注册是监听器启动时读取listener.ora配置,将实例和服务注册到监听程序。
监听器中对应的实例无论是否启动,都能通过lsnrctl services查询得到,但状态永远都是UNKNOWN。
无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。
我们采用静态注册方法将webdb服务注册到监听器中,$ORACLE_HOME/network/admin/listener.ora中的内容设置如下:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oratt/product/10.2.0/dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = webdb)
      (ORACLE_HOME = /u01/app/oratt/product/10.2.0/dbhome_1)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = serv1)(PORT = 1844))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

 
其中这几行文字是为了静态注册webdb而加入的,如下:

    (SID_DESC =
      (SID_NAME = webdb)
      (ORACLE_HOME = /u01/app/oratt/product/10.2.0/dbhome_1)
    )

 
监听器的服务状况一直是UNKNOWN,不管注册使用的数据库实例是否打开。如下所示:

oratt@serv1:/home/oratt=>webdb$lsnrctl services
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-NOV-2012 13:37:56
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=serv1)(PORT=1844)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
Service "webdb" has 1 instance(s).
  Instance "webdb", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:3 refused:0
         LOCAL SERVER
The command completed successfully

 
因为这个监听器的端口号不是1521,所以采用了静态注册方法。
我们也可以不修改listener.ora文件,而采用配置local_listener参数的方法,将这个实例动态注册到监听器。
在数据库实例上修改local_listener参数,如下所示:
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.15.90)(PORT=1844))))';
修改之后,使用lsnrctl services检查监听器的服务状况,会发现有webdb注册进来,其状态是ready。发现该服务已经注册到监听器。

oratt@serv2:/home/oratt=>webdb$lsnrctl services
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-NOV-2012 13:55:38
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=serv2)(PORT=1844)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
Service "webdb" has 1 instance(s).
  Instance "webdb", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "webdb_XPT" has 1 instance(s).
  Instance "webdb", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
The command completed successfully

 

如果数据库实例不是OPEN状态,在lsnrctl services的结果中将没有webdb的服务。
在data guard环境下,即使使用local_listener做了动态注册设置,也不会生效的。因为备库实例根本就不是open状态。
从主库向备库传输日志是采用oracle net传输的,这样以来就带来比较隐蔽的ORA-12514错误,增加我们管理难度。
出现的错误信息如下类似:

Wed Nov  7 17:23:15 2012
Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED
******************************************************************
LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
LNSb started with pid=20, OS id=17139
Error 12514 received logging on to the standby
Wed Nov  7 17:23:22 2012
LGWR: Error 12514 creating archivelog file 'webdb_standby'
Wed Nov  7 17:23:22 2012
Errors in file /u01/app/oratt/admin/webdb/bdump/webdb_lgwr_11220.trc:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
LGWR: Failed to archive log 3 thread 1 sequence 36 (12514)
Wed Nov  7 17:23:22 2012
Thread 1 advanced to log sequence 36 (LGWR switch)
  Current log# 3 seq# 36 mem# 0: /u01/app/oratt/webdb/redo03.log

 
在data guard的备库上,虽然我采用了动态注册,其实是不生效的。这点可以通过lsnrctl service去查证。只能采用静态注册,手工编辑listener.ora文件。


小结

 


通过对这个ORA-12514错误的分析和监听器工作原理一些介绍,以后在遇到这个错误时,我们应该先验证一下连接描述字符串中的service_name是不是不对,写错了还是服务器上监听器真的不能解析。
如果不能还不能解决,那么在客户端还有一种解决方法,就是将连接字符串中service_name修改为sid,直接从数据库实例进行连接。这是最传统的数据库访问方式。
使用service_name访问数据库的方式常常出现在Oracle RAC中,这是要使用它的负载均衡和透明故障切换功能。在很多JDBC数据库连接配置中,还是在坚持使用ip:sid:port方式连接数据库,这个方式的弊端经过此文你也了解一二了吧。

参考资料


以下是ORACLE官方文档对ORA-12514的描述:
ORA-12514: 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 <listener name>
- 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.

分享到:
评论

相关推荐

    ora-12514的错误的原因

    ORA-12514 错误的一个常见原因是监听器没有启动。在服务器端,监听器是数据库连接的入口点。如果监听器没有启动,客户端将无法连接到数据库。解决方法是启动监听器,可以使用命令 `lsnrctl start` 或 `C:lsnrctl ...

    ORA-12514错误解决办法

    ### ORA-12514错误解决办法 #### 错误概述 ORA-12514是Oracle数据库中常见的一个错误,全称为“TNS:listener does not...通过上述详细的分析和解决策略,我们可以有效地处理ORA-12514错误,并减少其对业务操作的影响。

    ORA-12514TNS监听程序当前无法识别连接描述符中请求服务的解决方法[借鉴].pdf

    但是,在使用 Oracle 时,用户经常会遇到各种错误,例如 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务的错误。这种错误会导致用户无法连接到 Oracle 数据库,影响正常的工作和生产。 在本文中,我们将...

    plsql不能连接linux下oracle问题ORA-12514.doc

    然而,在Linux环境下,PL/SQL可能无法连接到Oracle数据库,出现ORA-12514错误。本文档旨在解决这个问题,提供了详细的解决方案。 一、问题分析 在Linux环境下,PL/SQL无法连接到Oracle数据库,出现ORA-12514错误。...

    Oradim工具解决ora-12514其中一种情况

    ora-12514错误通常表示"监听程序无法解析服务名",这是由于网络配置问题或者监听程序没有正确注册服务导致的。然而,这里我们关注的是利用Oradim工具解决ora-12514的一种特定情况。 首先,让我们了解Oradim工具的...

    ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 解决方法.txt

    ### ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 解决方法 #### 错误概述 ORA-12514 是一个常见的 Oracle ...通过上述步骤,您可以解决 ORA-12514 错误并恢复客户端与 Oracle 数据库之间的正常连接。

    orcale 12514错误

    ORA-12514错误通常是由于监听器和服务配置不匹配引起的。通过检查并调整监听器和网络配置文件,以及验证环境变量和服务状态,可以有效地解决这一问题。确保所有配置的一致性和正确性是关键所在。

    Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法.pdf

    Oracle数据库不同版本间的客户端与服务端的连接问题通常涉及到安全和兼容性配置,这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决...

    ora-227101错误解决办法

    在Oracle数据库管理与维护的过程中,遇到各种错误代码是家常便饭,其中“ORA-227101”错误虽然在题目中被误标,实际案例中展示的是“ORA-27101”错误,这是一个较为常见的问题,通常发生在数据库服务未能正确启动或...

    Oracle_ORA-12518故障_处理

    ORA-12518/TNS-12518错误通常是由于监听器在将客户端连接移交给服务器进程或调度进程时出现问题所导致的。通过对监听器日志的分析、配置文件的检查、系统资源的调整等步骤,可以有效地解决这一问题。同时,针对不同...

    Oracle12cRAC数据库 出现ora-12520, ora-12516

    这两种错误代码分别表示“无法为服务找到可用实例”和“TNS:没有监听器”,通常与连接管理、进程和会话限制以及监听器配置有关。 #### 二、问题原因分析 ##### 1. 连接数达到上限 在Oracle12cRAC环境中,每个...

    ORACLE出现ORA-15414错误

    ORA-15414是Oracle数据库中的一种错误代码,通常表示“无效的监听器描述符列表”。这意味着在尝试连接到数据库时,监听器无法识别或处理连接请求中的某些部分。这种错误可能由多种因素引起,包括但不限于配置文件...

    ORA-12560 TNS 协议适配器错误

    - **查看监听器日志**:监听器的日志文件通常位于安装目录下的`diag/tnslsnr/hostname/log`目录下,可以通过查看这些日志来了解更详细的错误信息。 - **检查tnsnames.ora文件**:这是客户端用来解析服务器地址的配置...

    解决ORA-01033 ORACLE 正在初始化或关闭

    解决ORA-01033错误的关键在于仔细检查数据库的配置、监听器设置、环境变量以及资源分配情况。通过上述步骤,大多数情况下可以有效解决数据库初始化或关闭时遇到的问题。然而,在某些复杂场景下,可能需要更深入地...

    ORA-12154 TNS 无法解析指定的连接标识符

    - **客户端验证**:使用 `tnsping &lt;tns_name&gt;` 命令检查监听器是否可用。 - **服务器端操作**: - 查看监听状态:`lsnrctl status` - 启动监听服务:`lsnrctl start` ##### 2. 检查 tnsnames.ora 文件格式 - 使用...

    Oracle报ORA-12737问题解决方法

    然而,在日常使用过程中,我们可能会遇到各种错误代码,其中“ORA-12737”是一个常见的错误,它通常与网络连接或者数据库实例的启动有关。本文将深入探讨ORA-12737错误的原因、解决方案以及如何利用Oracle最新版本的...

Global site tag (gtag.js) - Google Analytics