`
cocoeye
  • 浏览: 15151 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

理解Oracle中的监听动态注册

 
阅读更多
在Oracle9i中,使用命令lsnrctl status可以看到如下例子:

Service "lrdb" has 2 instance(s).
Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...
Instance "lrdb", status READY, has 1 handler(s) for this service...



这是Oracle9i监听器行为的不同之处的第一个线索,因为Instance "lrdb"出现了两次。出现额外条目是因为,
数据库在启动时通过一个被称为动态注册的进程在监听器中注册信息。相应地,如果数据库通过listener.ora
文件中的信息在监听器中注册数据库这称为静态注册。在上面的输出中,状态UNKNOWN值的是静态注册的设置。
这是监听器用来表明它不知道关于该实例的任何信息的方式,只有当客户发出连接请求时,它才检查该实例是否
存在。

动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管何时数据库

关闭,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退(fallback)和负载平衡。自我注册功能是不能被关闭的(至少在任何可见的文档中是这样),由于该功能带来的好处,因此不能关闭它也并不是件坏事。当您可以免费获得数据库的自我注册功能时,为什么还需要listener.ora文件中的静态注册条目呢?您对此感到疑惑,是吗?答案是:除了几种例外情况外,您根本不需要执行静态注册。这样的结果是,只要使用默认的监听器端口1521,您就不再需要listener.ora文件。然而,当(且仅当)要把日志文件和跟踪信息保存到标准目录中时,您或许仍然会使用listener.ora文件。

下面是数据库的自我注册过程(假设在数据库启动之前,监听器已经启动并在正常运行)。无论何时启动一个数据
库,默认地都有两条信息注册到监听器中:实例和服务。

注册到监听器中的实例值从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取init.ora文件中的db_name的值。在只有单个实例运行的情况下,您可以不必设置该参数,但最好将其设置为db_name的值,以充分利用动态注册功能。然后,如果在RAC中配置,您必须将集群中每个实例的instance_name参数设置为一个唯一的值。

注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接
init.ora文件中的db_name和db_domain的值来注册自己。如果选择提供service_names值,您可以使用完全限定
的名称(比如lrdb.oracle.com)或缩写的名称(比如lrdb)。如果选择缩写的名称并设置了db_domain参数,注
册到监听器中的服务将是service_name值和db_domain值的拼接。例如下面的设置将导致服务lrdb.oracle.com
被注册到监听器中:
db_domain=oracle.com
service_name=lrdb

可选择的,您可以在service_names参数中指定多个服务值,值之间用逗号格开;这对于共享服务器配置是很有用的。
如果需要执行连接时故障转移或负载均衡,或者想要在RAC中配置在实例之间透明地分布连接,那么使用service_names参数将是必要的。为启用这些功能,您只需要将每个实例的数据库参数文件中的service_names设置为同一个值,并在客户端连接请求的service_name设置中引用该值。

为初始化参数service_names和instance_name设置显式的值是个很好的实践,尽管如果您没有设置它们,Oracle也会为动态注册而生成默认值(基于db_name和db_main)。这样做的原因是,如果监听器在数据库启动之后重新启动,其动态注册行为将会有一些微妙的区别.如果监听器在数据库运行之后重新启动,仅当在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的时间之后自动注册数据库.
如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会
发生;在这种情况下,如果监听器后来发生了重启,动态注册信息将会丢失。

显然,最后在启动任何数据库之前启动服务器上的监听器,并完全避免监听器的重启。另外,您还可以在SQL*PLUS中使用ALTER SYSTEM REGISTER命令,在数据库打开时的任何时候,手工地在监听器中注册服务值。这个命令对于替换因监听器重启而丢失地服务值很有用,并且它所注册地值与在数据库启动时由动态注册所设置的值完全一样。

总而言之,Oracle9i通过listener.ora中的GLOBAL_DBNAME向外提供静态服务,通过PMON读初始化参数service_names、instance_name向外提供动态(真实在运行的)服务。举例如下:

listener.ora文件内容

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/9.2.0.4)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = lrdb)
(ORACLE_HOME = /oracle/product/9.2.0.4)
(SID_NAME = lrdb)
)
(SID_DESC =
(GLOBAL_DBNAME = gsid)
(ORACLE_HOME = /oracle/product/9.2.0.4)
(SID_NAME = lrdb)
)
)

该文件使得这个单实例的数据库lrdb,向外提供了两个服务:lrdb和gsid

初始化参数设置:instance_name=lrdb service_name=lrdb,gsid

所以动态注册时也会对外提供两个服务:lrdb和gsid

最后通过lsnrctl status看到的情况就是:

Service "gsid" has 2 instance(s).
Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...
Instance "lrdb", status READY, has 1 handler(s) for this service...

Service "lrdb" has 2 instance(s).
Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...
Instance "lrdb", status READY, has 1 handler(s) for this service...

对外提供的服务gsid和lrdb都有两个实例(一个静态注册一个动态注册),状态都分别是UNKNOWN和READY。

对于客户端来说,它不用关心数据库的名字、实例名到底是什么,它只需要知道数据库对外提供的服务名就行了,
这个名字可能和实例名一样,也可能不一样。
分享到:
评论

相关推荐

    Oracle数据库教程——oracle静态监听和动态监听借鉴.pdf

    `PMON`会根据`init.ora`(现在的版本中通常称为`spfile`)配置文件中的`instance_name`和`service_names`参数,将实例和服务动态注册到监听程序。`instance_name`定义了数据库实例的名称,`service_names`则指定了...

    oracle9i数据库监听配置方法

    Oracle 9i数据库监听是数据库服务对外...总之,Oracle 9i数据库监听器的配置涉及多个步骤,理解并掌握这些步骤对于数据库管理员来说至关重要,这不仅关乎到数据库服务的稳定运行,也是确保数据安全和高效访问的基础。

    Oracle 单一主机多个实例多个监听器配置

    理解Oracle实例与监听器 在Oracle中,每个实例由一个后台进程组和共享内存结构组成,用于处理来自客户端的请求。监听器(Listener)则是负责接收网络请求并将它们转发给相应实例的服务。默认情况下,一个监听器...

    oracle注册.docx

    在动态注册中,需要在 init.ora 文件中指定 instance_name 和 service_names 参数的值。instance_name 参数指定实例名,service_names 参数指定服务名。如果这两个参数没有设置值,将使用 db_name 和 db_domain 的...

    监听配置的概念动态注册静态注册及各种场景的配置实例

    总结来说,监听配置是数据库管理中的基础工作,理解动态和静态注册的区别以及如何在不同场景下配置,对于优化数据库性能和保证系统稳定性至关重要。通过正确配置,可以确保服务的可发现性,同时增强系统的安全性和可...

    说说Oracle监听器(二)

    Oracle监听器还涉及到注册机制,分为静态注册和动态注册。静态注册在启动监听器时就指定要监听的实例和服务名,即使实例尚未启动。静态注册的配置在listener.ora文件中,每个SID_DESC代表一个配置项,包括实例名...

    Oracle监听器维护管理v1.1

    本文档详细介绍了Oracle监听器的工作原理、主要功能、基本操作、动态注册与静态注册、监听日志管理和分析以及针对远程监听的安全防范措施。 一、监听器工作原理 监听器主要负责接收客户端的连接请求,它在操作系统...

    Oracle数据库监听配置浅析与故障定位.pdf

    在基于网络通信的环境中,Oracle监听服务扮演着至关重要的角色。 #### 三、Oracle监听配置与管理 ##### 3.1 监听配置模板 采用Local Naming方式连接数据库时,需要配置三个关键文件:`listener.ora`、`sql...

    Oracle实战攻略之监听的故障处理方法和优化思路

    动态注册是由Oracle PMON(进程监控)后台进程在实例启动时自动向监听注册实例信息的,这一过程不需要DBA手动干预,但会受到诸如配置、网络等因素的影响。而静态注册则是在listener.ora配置文件中明确指定监听服务与...

    oracle data change notification,支持10.2以上的Oracle版本,速度很快,效率高

    1. **创建订阅者**:在应用程序中,你需要创建一个数据库连接,并注册一个监听器,该监听器会订阅感兴趣的表或视图。你可以通过`DBMS_CHANGE_NOTIFICATION`包中的函数来实现这一过程。 2. **注册表或视图**:指定要...

    Oracle 监听器 Listener资料.docx

    总之,Oracle监听器是数据库系统中至关重要的组件,它负责维持客户端与数据库实例之间的通信,确保数据访问的顺畅和系统的高可用性。理解并熟练掌握监听器的工作原理和操作,对于Oracle数据库的管理和维护至关重要。

    Oracle静态注册与动态注册详解

    **动态注册**则是由实例启动时的后台进程PMON根据`init.ora`(或`spfile`)中的`instance_name`和`service_names`参数自动将实例和服务注册到监听器。`instance_name`参数指定注册到监听器的实例名,如果未设置,则...

    Oracle listener详解

    在静态注册中,`GLOBAL_DBNAME`字段用于标识数据库服务,而`SID_NAME`字段标识具体的数据库实例。尽管这种方式配置简单,但数据库无法向监听器报告其状态,因此`lsnrctl status`命令可能显示服务状态为UNKNOWN。...

    Oracle 11g2的监听器配置教程

    - Oracle监听器是数据库的网络组件,允许客户端连接到Oracle数据库实例。 - 监听器配置确保数据库可以接受来自客户端的连接请求。 - 动态注册机制允许数据库在启动时自动注册其服务到监听器,无需手动修改配置文件。...

    Oracle监听器被优化大师挂掉后的完美解决方法

    总的来说,解决Oracle监听器被优化大师挂掉的问题,关键在于检查和修复注册表中的相关设置,特别是`ORACLE_HOME`变量和监听器服务的配置。同时,理解监听器的工作原理和配置文件内容也是解决问题的关键。在修复过程...

    Oracle_TNS浅析.doc

    从Oracle 9i开始,引入了动态监听服务注册的概念。这意味着当数据库启动时,PMON进程会自动将当前数据库实例注册到监听器的监听列表中,无需在`listener.ora`文件中显式配置实例信息。 - **启用动态监听的条件**: ...

    数据库中监听器配置

    8. **动态注册**:某些数据库版本支持实例的动态注册,这意味着数据库实例会自动向监听器报告其状态,这样监听器可以实时更新其服务列表,提高系统的可用性。 通过以上步骤,你应该能够掌握数据库监听器的基本配置...

    Oracle数据库实时同步

    这些脚本可以帮助更好地理解整个实时同步过程中的具体操作步骤。 #### 五、Oracle数据库实时同步的重要性 - **提高数据可靠性**:通过实时同步可以快速恢复数据,减少数据丢失的风险。 - **提高系统可用性**:在主...

Global site tag (gtag.js) - Google Analytics