zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    numpy—————数组操作
    ML———聚类算法之K-Means
    DataFrame————数据离散化处理(元素定位与离散化处理)
    windows 搭建和配置 hadoop + 踩过的坑
    Pandas -----简述 Series和DataFrame
    numpy 函数和用法总结、示例
    分词————jieba分词(Python)
    (31)本地yum仓库的安装配置
    (30)zookeeper的数据结构
    (29)zookeeper的命令行客户端
  • 原文地址:https://www.cnblogs.com/zmc60/p/15634270.html
Copyright © 2011-2022 走看看