静态注册:通过解析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;