监听静态注册与动态注册
注册监听通常包含以下信息
数据库服务名、实例名、可用的服务处理程序,用于调度(共享模式)和派生子程序(专用模式)端口号等。
常用的注册监听方式有两种
静态注册和动态注册
静态注册:就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。
静态注册:在动态注册不稳定时使用,特点是:稳定,注册过程比动态过程慢
动态注册:向侦听器注册一个实例的首选方法。因为他确保仅仅将运行中的实例和可用服务注册到侦听器,而实例和服务明不存在错误。且在关闭实例时,将自动从侦听器中注销。
采取静态监听注册方法时,listener.ora 文件的内容如下
单实例:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = db01) (ORACLE_HOME = /oracle/app/oracle/product/11.2.0) (SID_NAME = db01) ) ) LISTENER = -->监听器的名字,一台数据库可以有多个监听器 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = XXX)(PORT = 1521)) )
多实例:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle/app/oracle/product/11.2.0) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME =db01) (ORACLE_HOME = /oracle/app/oracle/product/11.2.0) (SID_NAME =db01) ) (SID_DESC = (GLOBAL_DBNAME =db02) (ORACLE_HOME = /oracle/app/oracle/product/11.2.0) (SID_NAME =db02) ) )
动态注册:
实例在启动时使用 PMON 进程自动将 instance_name 和 service_names 等信息注册到已启动的缺省监听器 listener.ora ,9i之后,不需要任何配置即可实现动态注册。实例启动后会自动在本地主机默认的端口号上查找监听器,并在查找到后进行注册。
可以在实例启动后任何时间执行下面命令实现重新注册;
alter system register;
或
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.2)(PORT=1521))';
采取动态注册方法时,listener.ora 的内容如下
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/app/oracle/product/11.2.0) (PROGRAM = extproc)
) )
既然有动态监听为什么还要静态监听呢?原因如下:
1、监听器不是最早启动,Oracle 实例先启动
2、监听器重启
3、Oracle 实例并没有 open。
查询某服务是静态注册还是动态注册
注意服务名中有些状态为 UNKNOWN,有些为 READY。
对于动态注册的服务名,因为监听器知道实例的状态,多益正常状态显示为 READY。
对于静态注册的服务名,通常显示为 UNKNOWN。
可以使用 lsnrctl status 来查看某服务是静态注册还是动态注册。
动态注册的数据库通过状态信息中的状态 READY 或状态 BLOCKED (对于一个备用数据库)来指明。不管何时关闭数据库,动态注册的数据库都会动态的从监听器注销,而与之相关的信息将从列表中消失。这样,不管数据库是运行还是已经关闭,监听器总是知道他的状态。