一、什么是注册?
注册就是将数据库作为一个服务注册到监听程序。
客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。
这个服务名可能与实例名一样,也有可能不一样。
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例名和服务名)
相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接.
二、如何查询某服务是静态监听注册还是动态监听注册
可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。
实例状态为UNKNOWN值时表明此服务是静态注册的设置。
这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态监听的状态是READY。
一、oracle监听的动态注册和静态注册区别?
动态注册:客户端(sys用户)只能在远程数据库启动的情况下连接上,远程数据库关闭时客户端连接不上远程数据库。
静态注册:无论远程数据库处于开启还是关闭状态,客户端(sys用户)都可连接上。
换一句换说静态注册可以在客户端控制服务器端数据库的启停,而动态注册则不可以。(动态注册的监听在实例关闭时会被注销)
数据库关闭的状态下,只有sys用户可连入数据库,其他用户不可连入。
二、数据库和监听注册的过程
1、如果知道数据库的信息,可以先在监听文件里面配置好要监听的数据库的实例名instance,并配置服务名server,这种就是静态监听,因为这个监听服务器是由监听程序发起的,所以状态一直是UNKNOWN,且数据库关闭后这个监听还会存在。
2、监听文件没有配置监听数据库的信息,但是当数据库启动的时候,会自动将instance_name,service_names两个参数将实例和服务动态注册到listener中,这种监听就是动态监听,因为这个监听是从数据库发起的,这个时候监听肯定是有对应的数据库,所以显示的状态是READ,当数据库关闭后这个监听也就消失了。
三、动态监听
动态注册使用默认端口1521时,不需要显示的配置listener.ora文件,实例MOUNT时,PMON进程就会根据instance_name,service_name参数将实例和服务动态注册到listerer中。
不同的参数注册到监听中的服务名、实例名有以下情况:
1)如果没有设定instance_name(10G后等于ORACLE_SID),将使用db_name初始化实例值。
2)如果service_names值为空,将拼接db_unique_name和db_domain参数值来注册监听(如果service_names和db_unique_name都设置了并且为不同的值,将产生两个服务名)。
3)如果选择设置service_names值,可以使用指定的名称(比如 orcl.oracle.com)或缩写的名称(比如orcl)。
4)如果选择缩写的名称并设置了db_domain参数,注册到监听器中的服务将是 service_name值和db_domain值的拼接。
5) 如果db_domain='com' service_names="bys3.com.cn",此时有两个监听服务:"bys3.com",,bys3.com.cn"
6)当db_unique_name - bys,,service_names-- bys3,,此时监听状态服务有两个:Service "bys" Service "bys3"
7)监听中有这种服务:Service "ocm1_XPT" has 1 instance(s).,原因是:隐含参数不知道怎么设置了, __dg_broker_service_names service names for broker use ocm1_XPT ,,将此隐含参数设置为空值监听中就不会有ocm1_XPT这种服务了。alter system set "__dg_broker_service_names"=' ';
注意:ORACLE_SID从ORACLE 10G开始,参数文件不再记录INSTANCE_NAME,此时INSTANCE_NAME动态从系统ORACLE_SID获得来保持一致。
动态监听的优点:
(1)不需要人工干预,在lsnrctl start后,会自动注册数据库的instance_name,service_name,然后tns不论使用SID和SERVICE_NAME均可以连接上来
(2)修改了SERVICE_NAME或者SID不用修改listener.ora文件
(3)动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。
不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。
这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。
该信息将被用于连接请求的回退(fallback)和负载平衡。动态监听由PMON进程会向监听进行动态注册,也可以手动注册:ALTER SYSTEM REGISTER;
动态监听的配置
使用默认监听名,默认TCP协议,默认端口1521可以不需要配置,连接时通过主机IP地址(或标识符)进行连接
监听名:用于启动监听,默认使用listener
通信协议(PROTOCOL):默认使用TCP
主机IP地址(HOST):可以使用IP地址和标识符(需要在hosts内写入解析地址)
主机端口号(PORT):默认使用1521
动态监听示例
YY=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ONE)(PORT = 1523))
)
)
使用动态监听,启动监听后不能立即提供服务。需要等待PMON轮询注册或者手动注册后才能对外提供服务。PMON会视系统繁忙程度不定期对端口号1521的通信情况进行轮询。但是使用端口号除1521外,其他端口PMON不会自动注册必须手动注册。
首次动态注册
alter system set local_listener='(address=(protocol=tcp)(host=ONE)(port=1523))';
动态注册列表
SQL> show parameter local_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string (address=(protocol=tcp)(host=O
NE)(port=1523))
启动动态监听后,进行动态注册(1521端口,PMON会定期自动注册。其他端口需要手动注册)
ALTER SYSTEM REGISTER;
四、静态监听
静态注册指实例启动时读取listener.ora配置文件,将实例和服务注册到监听程序。
优点:
无论何时启动一个数据库,默认都有两条信息注册到监听器中:实例和服务。
在数据库未open状态中,就可以远程连接到数据库,对数据库进行操作--当然了要配置密码文件。
静态监听的配置
监听名、通信协议(PROTOCOL)、主机IP地址(HOST)、主机端口号(PORT)
另外还需要配置
SID_LIST_静态监听名:体现这个监听是一个静态监听,并且指定这个监听为哪个实例进行服务
全局数据库名(GLOBAL_DBNAME):标识启动的数据库,tnsnames.ora的service_name通过服务名与数据库进行连接,辨识静态监听服务的数据库。所以global_dbname与service_name需要相同
ORACLE_HOME:数据库所在目录,可以通过环境变量.bash_profile进行查看
SID_NAME:需要服务的实例名,通过show parameter name或环境变量进行查看
ADR_BASE_LISTENER:
用来指定监听的log和trace放在哪里。
静态监听示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ONE)(PORT = 1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME = DC)
(ORACLE_HOME =/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = ONE)
)
)
TT=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ONE)(PORT = 1522))
)
)
SID_LIST_TT=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME =orcl)
(ORACLE_HOME =/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = ONE)
)
)
ADR_BASE_LISTENER = /u01
五、客户端TNSNAMES配置
连接标识符:用于简化连接,通过连接标识符在tnsnames内进行解析
通信协议(PROTOCOL):默认使用TCP
主机IP地址(HOST):可以使用IP地址和标识符(需要在hosts内写入解析地址)
主机端口号(PORT):默认使用1521
服务器方式(SERVER):即server process(服务器进程)提供服务的方式,分为专用和共享两种方式。
DEDICATED(专用):用户进程与服务器进程逐个对应 , 默认使用专用服务器
SHARE(共享):多个用户进程对应一个服务器进程,由Oracle 实例生成和管理。并通过进程调度器(dispatcher)进行轮流服务。必须配置net services(TNS)。这种方式适合小事务、高并发的数据库,这样能够减少oracle对服务器资源的消耗。
服务名(SERVICE_NAME):用来将客户端与服务器端进行连接,与中global_dbname进行连接,所以listener.ora中的global_dbname与tnsnames.ora中的service_name需要相同。
TNSNAMES配置示例
BB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ONE)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DC)))
DD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ONE)(PORT = 1523))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ONE)
)
)
CC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ONE)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
六、连接方式
1、简易连接:简易连接需要提供通信协议、端口号和服务名进行连接
[oracle@ONE ~]$ sqlplus sys/oracle@ONE:1521/DC as sysdba
其中ONE在hosts里面已经进行解析标识
2、通过TNS连接:需要配置tnsnames.ora文件
sqlplus sys/oracle@BB as sysdba
通过TNS连接只需要提供标识符即可
七、lsnrctl监听常用命令
命令
|
含义
|
START
|
启动监听器
|
STOP
|
停止监听器
|
STATUS
|
当前监听器状态
|
RELOAD
|
重启监听器(stop和start)
|
SERVICES
|
当前监听器提供的服务(比status显示的更完整)
|
VERSION
|
当前监听器版本
|
SAVE_CONFIG
|
将任何联机更改写入listener.ora文件
|
TRACE
|
启动对当前监听器活动的追踪
|
SPAWN
|
在listener.ora文件中的别名产生一个新的程序
|
CHANGE_PASSWORD
|
改变现有的口令或设置新的口令
|
QUIT
|
退出监听管理器,不保存对listener.ora文件的更改
|
EXIT
|
退出监听管理器,并保存对listener.ora文件的更改
|
SET
|
设置监听器参数
|
SHOW
|
显示监听器已经设置的参数
|
help
|
帮助信息
|
对应多个监听器需要在命令后面加入监听名
如:[oracle@ONE ~]$ lsnrctl status TT