listener静态注册与动态注册
一、 什么是注册
在数据库服务器和客户端之间有一监听程序(listener),当数据库服务器启动过程中,数据库服务器默认的会将两条信息注册到监听器中:数据库服务器对应的实例名和服务名。当客户端需要连接数据库时,客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。服务名可能与实例名一样,也有可能不一样。
二、 静态注册
静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。
静态注册时listener.ora中的global_dbname(即init.ora中的servive_names)向外提供服务名,sid_name(即init.ora中的instance_name)提供注册的实例名
1、 默认静态注册
l 配置listener.ora
SID_LIST_LISTENER = //名字要用默认的监听器的名字“LISTENER”
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = d:\oracle)
(PROGRAM = extproc)
) //用于plsql调用外部程序,如c、java程序等,可根据需要配置,非必须项
(SID_DESC =
(SID_NAME = chenl)
(ORACLE_HOME = d:\oracle)
(global_dbname=chenl)
//global_dbname为非必须项,若不指定则默认为db_name+db_domain
)
)
l lsnrctl start(或者lsnrctl start listener)//静态注册到默认的监听器“listener”上
2、 非默认静态注册
l 配置listener.ora
SID_LIST_CHENL =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = d:\oracle)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = chenl)
(ORACLE_HOME = d:\oracle)
(global_dbname=chenl) //非必须项,默认为db_name+db_domain
)
)
CHENL =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.15.99)(PORT
=1522))
)
)
)
l lsnrctl start chenl (静态注册到非默认的监听器“chenl”上)
注意:此时如果使用 lsnrctl start 将动态注册到默认的监听器“listener”上
三、动态注册
动态注册是在实例启动时PMON进程根据init.ora中的service_names和instance_name将服务和实例动态注册到监听中。 如果instance_name没有设定值,它将取init.ora中的db_name的值,在只有单个实例运行的情况下,您可以不必设置该参数,但如果在RAC中,您必须保证每个实例的instance_name参数值唯一;如果service_names没有设定值,将拼接init.ora中的db_name和db_domain参数来注册。
可以在sqlplus下通过show parameter service_names 和show parameter instance_name 查看这两个参数的值。
如果没有显示设置service_names和instance_name的值,那么数据库仅在监听器运行之后启动时,动态注册才会发生。如果监听器在数据库运行过程中重启,动态注册信息将会丢失。
如果显示设置了service_names和instance_name的值,如果监听器在数据库运行过程中重启,数据库的PMON进程将在很短时间内完成动态注册。
1、 默认动态注册
动态注册默认会注册到默认的监听器上(名称是LISTENER,端口是1521,协议是TCP),无需配置listener.ora文件即可完成注册。
l lsnrctl star或lsnrctl start listener //可启动默认动态注册;
l SQL>alter system register;(手动注册加快lsnrctl start 之后的注册速度,不然需要等待一分钟的时间)。
2、 非默认动态注册
需要手动在配置文件中指定端口号。即在服务器端需配置listener.ora与tnsnames.ora(根据loca_listener的设置方式不同来看是否需要配置此项)、在数据库中设置loca_listener参数
l 配置服务器端的listener.ora
CHENL =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.15.99)(PORT
=1522))
)
)
)
l 配置服务器端的tnsnames.ora
CHENL= //注意服务名必须与listener.ora中的监听名一致
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.25)(PORT =
1522))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = chenl)
)
)
注:客户端tnsnames.ora中的服务名可以与服务器的监听名不一致
l 配置local_listener参数
SQL>alter system set local_listener = 'chenl';
// 监听名必须与服务器端tnsnames.ora文件的网络服务名一致
如果使用下面方式设置local_listener参数,则不需要在服务器端tnsnames.ora中配置对应的服务名,只需要配置listener.ora这一步,然后执行下面参数:
SQL> alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.25)(PORT = 1522))';
l lsnrctl start chenl
四、 查询某服务是静态注册还是动态注册
可以用lsnrctl status来查看某服务是静态注册还是动态注册:
l 实例状态为UNKNOWN时表明此服务是静态注册的,这时监听器不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
l 实例状态为READY或状为BLOCKED时表明此服务为动态注册。