19.Oracle的动态监听和静态监听

静态注册:通过解析listene.ora文件

动态注册:由PMON进程动态注册至监听中

在没有listener.ora配置文件的情况下,如果启动监听,则监听为动态注册。用图形化netca创建的监听,默认也为动态注册

1.静态注册

listener.ora文件,监听的配置文件,静态注册读取该文件,动态注册,不必要

可以通过netca工具创建,也可以手动编辑。典型的listener.ora文件内容:

LISTENER_PHAMR = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = phamrdb1-vip)(PORT = 1521)) 
  )

 

SID_LIST_LISTENER_PHALR = 
  (SID_LIST = 
    (SID_DESC = 
      (GLOBAL_DBNAME = phalr) 
      (ORACLE_HOME = /oracle/product/11.2.0) 
      (SID_NAME = phalr) 
    ) 
  )

listener.ora文件两大模块:

LISTENER模块:监听名字、连接协议、监听主机、监听端口等基本配置信息

SID_LIST_LISTENER模块:配置监听的静态注册特性,包含数据库服务名、ORACLE_HOME、实例名等信息。

注意:SID_NAME,就是数据库实例名,在Linux环境大小写敏感

GLOBAL_DBNAME就是数据库服务名,可以省略,默认和SID_NAME保持一致,也可以不一致。

ORACLE_HOME,默认和$ORACLE_HOME环境变量保持一致。Windows,该参数无效,取自注册表。

静态注册,监听不知道实例的具体状态,所以监听启动之初查看实例信息,其状态信息显示为UNKNOWN

2.动态注册

在动态注册监听的环境中,listener.ora文件可以不包括当前数据库的实例信息,所以这个文件不必要。动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中,首先要在init.ora中指定instance_name,service_names两个参数的值。在sqlplus下通过show parameter service_names 和show paramerter instance_name查看这两个值

实例启动时,会由Oracle PMON进程将数据库实例信息动态注册至监听上。

当Oracle实例关闭时,会再次由PMON进程自动从监听里面撤销当前实例信息。

所以,要实现动态注册,数据库的实例至少要处于nomount状态

监听动态注册时的实例状态:来自PMON进程动态注册时的实例状态,一般有3种状态:READY、BLOCKED和RESTRICED

READY:表示数据库实例已经处于mount或者open状态,可以接受客户端连接

BLOCKED:表示数据库实例还处于nomount状态或者该实例类型为ASM实例,不接受客户端连接,如果这时候客户端去连

               接数据库会报ora-12528错误

RESTRICED:表示数据库处于RESTRICED模式,不接受普通权限的远程客户端连接,如果这时候客户端去连接数据库会报

                  ora-12526错误

动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),如果需要向非默认监听注册,则需要配置local_listener参数!

  如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会发生;在这种情况 下,如果监听器后来发生了重启,动态注册信息将会丢失。显然,最好在所有的数据库启动之前先启动监听器,这样就会避免没有显式设置 service_names和instance_name的值时,若重启监听器带来的动态注册信息丢失的情况。

  为初始化参数service_names和instance_name设置显式的值是个值得可取的方法和建议。因为如果监听器在数据库运行过程中要重新启 动,仅当你在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的 时间之内完成动态注册。

3.什么是注册?

注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名

就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。

在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册

到监听器中:数据库服务器对应的实例和服务。)

相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一

个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。

 

4.补充一点:

  动态注册是在instance启动的时候PMON进程根据instance_name,service_name两个参数将实例和服务注册到监听器中。由于动态注册需要pmon进程,所以监听必须在数据库启动之前启动,否则动态注册将失败;在数据库运行的过程中,如果重启监听也会造成动态注册失败。动态注册只是注册默认的监听器上(名称是listener、端口是1521、协议时TCP),如果需要向非默认的监听注册,则需要改变local_listener参数,将监听的信息添加到tnsnames.ora文件中。注意,是tnsnames.ora 文件,因为pmon在动态注册监听时要从tnsnames.ora中读取相关信息。例如:

SQL> alter system set local_listener=mylistener;

然后需要在tnsnames.ora中添加如下内容:

mylistener=(DESCRIPTION=

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx)(PORT = 1530))

(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx)(PORT = 1534))

)(CONNECT_DATA=(SID=oracl)))

这样实例启动时就会注册到两个不同端口的listener上,或者将local_listener参数改到特定的主机和端口上,就不需要再在tnsnames.ora中维护相关信息。但这只适用于单listener的情况:

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx)(PORT = 1522))';

SQL> alter system register;

 

posted on 2021-12-02 17:20  太白金星有点烦  阅读(1660)  评论(0编辑  收藏  举报

导航