一、注册类型和区别
1、 注册概念,类型
注册就是将数据库作为一个服务注册到监听程序中。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请链接到数据库。这个服务名可以与数据库名一样,也有可能不一样
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册
到监听器中:数据库服务器对应的实例和服务。)
2、 类型
注册分为静态注册,动态注册
静态注册:
1) 在数据库没有open状态时,也可以连接到数据库,进行操作,不安全但是可以启动关闭之
2) 启动过程可以晚于database,并且可以在数据库运行期间重启
动态注册:
1) 启动过程最好是在数据库启动之前
2) 如果是向非默认端口注册,需要配置local_listener参数
3、 区分
1) 使用lsnrcel status
如果提示实例状态unknown表明是静态注册,直到客户端发送连接请求,监听才检查实例是否存在
如果状态ready或者是blocked(备用数据库),表明是动态注册,监听其会动态获知数据库的状态信息,该信息将被用于连接请求的回退和负载平衡
2) 查看listener.ora文件
如果文件中包含比如以下内容,就是静态注册,否则是动态注册
(SID_DESC=
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = XXX)
(SID_NAME = ORCL)
)
二、静态注册
静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序中
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME =XXX)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = XXX)
(SID_NAME = ORCL)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl1)
(ORACLE_HOME =XXX)
(SID_NAME = ORCL)
)
)
golbal_dbname是数据库对外提供的服务名,sid_name是实例名,该数据库只有一个实例,但是又两个服务名,集群可以提供多个实例
以下是监听两个实例
LISTENER=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =XXX)(PORT= 1521))
)
)
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME =orcl1_server)
(ORACLE_HOME =XXX)
(SID_NAME = orcl1)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl2_server)
(ORACLE_HOME =XXX)
(SID_NAME = orcl2)
)
)
静态注册时,listener.ora中的GLOBAL_DBNAME向外提供服务名,listener.ora中的SID_NAME提供注册的实例名
三、动态注册
动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中
首先要在init.ora中指定instance_name,service_names两个参数的值。在sqlplus下通过showparameter service_names 和show parameter instance_name可以查看这两个参数的值。
注册到监听器中的实例值从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取init.ora文件中的db_name的值。
注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接init.ora文件中的db_name和db_domain的值来注册自己。如果选择提供service_names值,您可以使用完全限定的名称(比如 orcl.oracle.com)或缩写的名称(比如orcl)。如果选择缩写的名称并设置了db_domain参数,注册到监听器中的服务将是 service_name值和db_domain值的拼
接。例如下面的设置将导致服务orcl.oracle.com被注册到监听器中:
db_domain=oracle.com
service_names=orcl ;
可选择的是,您可以在service_names参数中指定多个服务值,值之间用逗号格开,这对于共享服务器配置是很有用的。
动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),如果需要向非默认监听注册,则需要配置
local_listener参数!
比如要注册
LISTENER=
(DESCRIPTION=
(ADDRESS= (PROTOCOL = TCP)(HOST = XXX)(PORT = 1522))
)
以sys用户登陆,执行:
altersystem set local_listener=listener;
alter system register;
或者
alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = XXX)(PORT= 1522))';
alter system register;
如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会发生;在这种
情况 下,如果监听器后来发生了重启,动态注册信息将会丢失。显然,最好在所有的数据库启动之前先启动监听器,这样就会避免没
有显式设置 service_names和instance_name的值时,若重启监听器带来的动态注册信息丢失的情况。
为初始化参数service_names和instance_name设置显式的值是个值得可取的方法和建议。因为如果监听器在数据库运行过程中要
重新启 动,仅当你在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的 时
间之内完成动态注册。
四、疑问
比如在我的机器上注册的文件为
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = loge-PC)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = G:\app\Administrator\product\11.2.0\dbhome_1)
(GLOBAL_DBNAME = orcl)
)
)
ADR_BASE_LISTENER = G:\app\Administrator\product\11.2.0\dbhome_1\log
这就提供了两个动态注册和静态注册,看看状态
LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 15-APR-2014 22:12
:19
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=loge-PC)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
Start Date 15-APR-2014 22:06:30
Uptime 0 days 0 hr. 5 min. 51 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File D:\instantclient_11_2\listener.ora
Listener Log File g:\app\administrator\product\11.2.0\dbhome_1\log\diag\
tnslsnr\loge-PC\listener\alert\log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=loge-PC)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
Services Summary...
Service "orcl" has 2 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
unknown表示静态注册
五、问题
如果出现查看坚挺时候提示:The listener supports no services
或者表示动态监听,或者表示监听目前有问题,如果是第一种情况检查数据库服务,,如果是第二种那就有很多原因了
一下是可供参考的原因
主机改动过ip地址,linux下修改hosts文件即可
asm创建的数据库,监听默认放在grid用户下的network目录下,这个原因废了我好长时间找到,不了解新特性的弊端啊