监听的注册分两种:
1、静态注册;
2、动态注册。
一、静态注册
静态注册是指指定监听需要服务某个特定实例的客户端连接。即在listener.ora文件的SID_LIST_LISTENER模块中明确写明监听需要处理的实例名字,但监听并不关心数据库服务器上是否有真正的实例在运行。
1、配置内容
1.1、SID_NAME:数据库实例名,即与
select
instance_name from v$instance;
的查询结果一致,不可省略。
1.2、GLOBAL_DBNAME:数据库服务名,可以省略,默认和SID_NAME保持一致。
1.3、ORACLE_HOME:实例运行的ORACLE_HOME目录,在Linux和UNIX环境下,该参数可以省略,默认和环境变量$ORACLE_HOME一致。在Windows环境中,该参数无效,ORACLE_HOME的值取自注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID。
上述三个配置内容都是SID_DESC参数的内容,SID_DESC对于静态注册来说是必须存在的参数。示例:
SID_LIST_LISTENER =
(SID_LIST
=
(SID_DESC
=
(GLOBAL_DBNAME=ocp11g)
(ORACLE_HOME
= /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME
= ocp11g)
)
(SID_DESC
=
(GLOBAL_DBNAME
= hiber)
(ORACLE_HOME =
/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME
= hiber)
)
)
当为静态注册时,监听状态中的服务名(service)取自listener.ora中的关键字GLOBAL_NAME,监听状态中的实例名(Instance)取自listener.ora中的关键字SID_NAME。
二、动态注册
与静态注册相对,动态注册模式下,listener.ora文件中可以不包含当前数据库的实例信息,甚至可以没有listener.ora这个文件。实例启动时,ORACLE系统会从初始化参数文件中读取有关监听程序的初始化参数,如service_names,会由PMON进程向监听程序动态的注册信息。当实例关闭时,会再次由PMON进程自动从监听里面撤销当前实例的信息,所以要实现动态注册,数据库的实例至少要处于NOMOUNT状态。
手动注册实例信息至监听的命令:
alter system register;
该命令实际上是手动触发PMON进程去更新实例信息。
1、动态注册的内容
PMON进程主要向监听注册如下内容:
1.1、根据数据库参数SERVICE_NAME和INSTANCE_NAME注册当前数据库的服务名和实例名。
1.2、当前实例的负载情况
1.3、当前实例负载服务的句柄(service
handle),如dispatchers和dedicated servers。
1.4、PMON启动时的系统环境信息。
注意:在没有listener.ora配置文件的情况下,如果启动监听,则监听为动态注册。用图形化工具netca创建的监听,默认也为动态注册。
2、需要注意的几个参数
监听状态中的几个名字来源的参数需要注意一下:
1、监听状态中的服务名取自数据库参数SERVICE_NAMES;
2、监听状态中的实例名取自数据库参数INSTANCE_NAME;
在配置文件tnsnames.ora连接串中的关键字SERVICE_NAME需要和listener.ora的关键字GLOBAL_DBNAME或者Oracle参数SERVICE_NAMES的值相同。
在配置文件tnsnames.ora连接串中关键字SID的值需要和listener.ora的关键字SID_NAME的值相同。
3、动态注册时的实例状态
在动态注册时,监听中的实例状态来自PMON进程动态注册时的实例状态,一般有3种,BLOCKED、RESTRICTED和READY。
3.1、BLOCKED一般表示实例处于NOMOUNT状态或者该实例类型为ASM实例,不接受客户端连接;
3.2、RESTRICTED一般表示数据库处于RESTRICT模式,不接受普通权限的远程客户端连接;
3.3、READY一般表示实例已处于MOUNT和OPEN状态,客户端可以连接。