- 浏览: 1098631 次
- 性别:
- 来自: 南京
博客专栏
-
Oracle管理和开发
浏览量:353042
最新评论
-
Simon.Ezer:
请问对于“如果非主键字段值发生改变,则不会同步过去”这种情况, ...
创建增量同步Oracle物化视图问题 -
dahai639:
挺好的,支持一下
Oracle的pipelined函数实现高性能大数据处理 -
zealotpz:
不错,原来是用户oracle 的所属组的问题
以sysdba身份登录oracle报ORA-1031权限不足错误之完美分析 -
mikixiyou:
zhangyuslam 写道如果担心全局索引失效,可以使用如下 ...
Oracle分区表的分区交互技术实现数据快速转移 -
sea0108:
...
Oracle sql loader使用速成
在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.
发表评论
-
Oracle分区表的分区交互技术实现数据快速转移
2013-01-22 11:48 14808有一个需求,将某业务表的某个时间点之前的记录转移到它的历史 ... -
等待事件enq TX row lock contention分析
2013-01-17 17:16 33295在Oracle数据库性能报告AWRRPT分析时,发现top ... -
Oracle的UNDO表空间管理总结
2013-01-14 15:06 12987UNDO是Oracle中的一个很 ... -
Oracle在不同windows系统中的迁移
2013-01-09 15:41 3806在Windows操作系统环境下 ... -
Oracle 10.2.0.1在windows 2008上安装失败经历
2013-01-07 10:29 8705这两天遇到这个一个项目上的数据库迁移的问题。原来的环境是数据库 ... -
所有的物化视图刷新脚本
2012-12-28 13:59 0select 'execute dbms_mview.refr ... -
Oracle数据库的SQL性能问题分析
2012-12-27 15:31 5289在Oracle 10.2.0.4数据库中,有一个SQL执行缓慢 ... -
db block gets和consistent gets的分析
2012-12-26 18:09 0在Oracle的文档中有这样一段解释: db block g ... -
创建增量同步Oracle物化视图问题
2012-12-25 14:07 15312我们采用Oracle的物化视图增量刷新机制定时将数据库A上的某 ... -
查归档日志文件每小时生成量
2012-12-18 16:13 10792在O racle数据库中,通过v$archived_lo ... -
如何删掉临时表空间的文件
2012-12-18 15:40 0Unlike Oracle datafiles which m ... -
Oracle sql性能诊断暨event 10046和10053使用
2012-12-17 10:24 0早上em grid control监控显示数据库的负载增加,其 ... -
查LOB字段占用的空间大小
2012-12-13 16:00 4579查询Oracle表中LOB字段的占用空间大小。表中每一个LOB ... -
Oracle Data Guard的重做日志传输和应用状况监控
2012-12-04 14:05 4079这是一个用来监控Oracle Data Guard环境下从主库 ... -
Oracle sql loader使用速成
2012-11-30 14:14 4952Oracle SQL LOADER是Oracle的 ... -
Oracle 11g2的监听器配置
2012-11-29 14:34 4391Oracle的监听器服务注册 ... -
Deleting archivelog on physical standby with RMAN in Oracle 10g
2012-11-28 13:25 0Turns out to be quite easy ... -
to_char将number转成string的小技巧
2012-11-27 14:14 10638很多数据转换处理操作时,会遇到将0.007007040000转 ... -
to_date转成字符串时ORA-01843 not a valid month 问题分析
2012-11-26 16:38 29307(注,本文三度易稿) 在开发Oracle SQL或PL/SQL ... -
Data Guard 10g 的保护级别为RESYNCHRONIZATION问题
2012-11-25 11:01 1922Oracle的data guard创建完成 ...
相关推荐
ORA-12514 错误的一个常见原因是监听器没有启动。在服务器端,监听器是数据库连接的入口点。如果监听器没有启动,客户端将无法连接到数据库。解决方法是启动监听器,可以使用命令 `lsnrctl start` 或 `C:lsnrctl ...
### ORA-12514错误解决办法 #### 错误概述 ORA-12514是Oracle数据库中常见的一个错误,全称为“TNS:listener does not...通过上述详细的分析和解决策略,我们可以有效地处理ORA-12514错误,并减少其对业务操作的影响。
但是,在使用 Oracle 时,用户经常会遇到各种错误,例如 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务的错误。这种错误会导致用户无法连接到 Oracle 数据库,影响正常的工作和生产。 在本文中,我们将...
然而,在Linux环境下,PL/SQL可能无法连接到Oracle数据库,出现ORA-12514错误。本文档旨在解决这个问题,提供了详细的解决方案。 一、问题分析 在Linux环境下,PL/SQL无法连接到Oracle数据库,出现ORA-12514错误。...
ora-12514错误通常表示"监听程序无法解析服务名",这是由于网络配置问题或者监听程序没有正确注册服务导致的。然而,这里我们关注的是利用Oradim工具解决ora-12514的一种特定情况。 首先,让我们了解Oradim工具的...
### ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 解决方法 #### 错误概述 ORA-12514 是一个常见的 Oracle ...通过上述步骤,您可以解决 ORA-12514 错误并恢复客户端与 Oracle 数据库之间的正常连接。
ORA-12514错误通常是由于监听器和服务配置不匹配引起的。通过检查并调整监听器和网络配置文件,以及验证环境变量和服务状态,可以有效地解决这一问题。确保所有配置的一致性和正确性是关键所在。
Oracle数据库不同版本间的客户端与服务端的连接问题通常涉及到安全和兼容性配置,这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决...
在Oracle数据库管理与维护的过程中,遇到各种错误代码是家常便饭,其中“ORA-227101”错误虽然在题目中被误标,实际案例中展示的是“ORA-27101”错误,这是一个较为常见的问题,通常发生在数据库服务未能正确启动或...
ORA-12518/TNS-12518错误通常是由于监听器在将客户端连接移交给服务器进程或调度进程时出现问题所导致的。通过对监听器日志的分析、配置文件的检查、系统资源的调整等步骤,可以有效地解决这一问题。同时,针对不同...
这两种错误代码分别表示“无法为服务找到可用实例”和“TNS:没有监听器”,通常与连接管理、进程和会话限制以及监听器配置有关。 #### 二、问题原因分析 ##### 1. 连接数达到上限 在Oracle12cRAC环境中,每个...
ORA-15414是Oracle数据库中的一种错误代码,通常表示“无效的监听器描述符列表”。这意味着在尝试连接到数据库时,监听器无法识别或处理连接请求中的某些部分。这种错误可能由多种因素引起,包括但不限于配置文件...
- **查看监听器日志**:监听器的日志文件通常位于安装目录下的`diag/tnslsnr/hostname/log`目录下,可以通过查看这些日志来了解更详细的错误信息。 - **检查tnsnames.ora文件**:这是客户端用来解析服务器地址的配置...
解决ORA-01033错误的关键在于仔细检查数据库的配置、监听器设置、环境变量以及资源分配情况。通过上述步骤,大多数情况下可以有效解决数据库初始化或关闭时遇到的问题。然而,在某些复杂场景下,可能需要更深入地...
- **客户端验证**:使用 `tnsping <tns_name>` 命令检查监听器是否可用。 - **服务器端操作**: - 查看监听状态:`lsnrctl status` - 启动监听服务:`lsnrctl start` ##### 2. 检查 tnsnames.ora 文件格式 - 使用...
然而,在日常使用过程中,我们可能会遇到各种错误代码,其中“ORA-12737”是一个常见的错误,它通常与网络连接或者数据库实例的启动有关。本文将深入探讨ORA-12737错误的原因、解决方案以及如何利用Oracle最新版本的...