Skip to content

Database - 56. page

oracle中的监听:静态注册和动态注册详解

关于监听的操作

注册(register)就是将数据库作为一个服务注册到监听(listener).客户端不需要知道数据库名字和实例
名字,只需要知道数据库对外提供的服务名(service_name)就可以申请连接到数据库.这个服务名字可以设
置成和实例名字一样,也可以根据业务需求设计。在数据库启动过程。oracle会向监听程序注册相应的服务
,任意的一个数据库都会有两条信息注册到监听器中:oracle对应的instance_name和service_name。

客户端是通过监听程序连接到数据库服务器的,监听中记录着相应的oracle service,而客户端只需要在tn
snames中提供正确的服务名就可以建立和数据库服务器的连接。

一:静态注册监听:
如果采用的是静态注册监听,那么实例启动时候读取listener.ora文件的配置,讲实例和服务注册到监听,
如下面的listener就是静态注册。这里global_name提供对外的服务名,sid_name提供实例名。而在tnsnam
es中配置的service_name正是对应的global_name的名字。

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/10.2/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_NAME= luda)
(ORACLE_HOME = /oracle/product/10.2/db_1)
(SID_NAME = LUDA)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
tnsname.ora配置文件:
LUDA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.224)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = luda)
)
)

tnsname的serviece_name和对应的global_name要对应,大小写要却分,host用IP代替,看个人习惯。
instance_name只有唯一的一个名称,而service_name可以有多个用于tnsnames.ora客户端连接,连接字符串
(TNS中的LUDA就是一个字符串)也可以随意取名对于客户端来说,它不用关心数据库的名字、实例名到底是
什么,它只需要知道数据库对外提供的服务名就行了,这个名字可能和实例名一样,也可能不一样。

———————————————
动态注册监听:
* 删掉listener配置文件,则为默认的动态配置

动态注册就是实例启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服
务动态注册到listener中。在没有配置listener文件的时候,在init.ora文件中指定了instance_name,servi
ce_names两个参数的值。注册到监听器中的实例从init.ora文件中的instance_name参数获得(这里pfile和s
pfile就不作解释了),如果没有设置instance_name,那么将从初始化参数文件中取db_name的值。可以通过
show parameter或者试图v$parameter查找这两个参数的值。注册到监听中的服务值从初始化参数文件的serv
ice_name获取。如果该参数没有设置,数据库将拼接init.ora中的db_name和db_domain的值来注册。如果设置
了service_names的值,可以根据业务需求等设置名称,比如ora1.taobao.com或者缩写ora1.如果是缩写,并
且设置了db_domain,那么注册到listener的服务名将是service_name。db_main,比如:
db_main=luda.com
service_name=ora1

那么注册到监听的服务名则是:
ora1.luda.com

动态注册时候,listener.ora的内容为:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/10.2/db_1)
(PROGRAM = extproc)
)
)

* service_names参数中可以设定多个服务值,服务名之间用逗号隔开,这对于共享服务器的配置是很有用的。
* 动态注册默认的端口为1521,监听名为listener,协议为TCP,需要向非默认监听注册,则需要配置local_listener
参数
格式为
ALTER SYSTEM SET LOCAL_LISTENER=’ (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.224)(PORT = 1522))

—————————————————————————————————–

如果在动态注册下没有显示设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时候,
动态注册才会法师;这种情况下,如果监听故障或者重启那么动态注册信息将丢失。所以在数据库启动之前先开启
监听,避免监听重启等 在service_names和instance_name没有设置情况下,造成动态注册信息丢失,在init.ora中
设置service_names and instance_name是个好办法,这样监听可以快速的注册动态信息。

静态注册的监听实例状态为unknow,只有客户端请求连接到实例时候才会去检查实例是否存在。
动态注册的监听实例为ready或者blocked状态,不管数据库何时关闭和启动这时候的监听都能时时动态刷新正确的
数据库 信息,不管数据库是什么状态,监听都能知道。