动态注册不需要显示的配置listener.ora文件,实例启动的时候,PMON进程根据instance_name,service_name参数将实例和服务动态注册到listerer中。如果没有设定instance_name,将使用db_name初始化参数值。如果没有设定service_names,将拼接db_name和db_domain参数值来注册监听。
SQL> show parameter db_name //说明不同的实例名可以对应同一个db_name
NAME TYPE VALUE
--------------------- -------- -----------
db_name string test
SQL> show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string test
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string test
LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 24-SEP-2008 16:50:01
Uptime 0 days 0 hr. 0 min. 33 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test1)(PORT=1521)))
Services Summary...
Service "test" has 1 instance(s).
Instance "test", status READY, has 1 handler(s) for this service...
Service "test_XPT" has 1 instance(s).
Instance "test", status READY, has 1 handler(s) for this service...
The command completed successfully
SQL> alter system set service_names='oratest' scope=both;
System altered.
SQL> alter system set instance_name='instest' scope=spfile; //修改instance_name的语句
System altered.
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
test OPEN
SQL> show parameter instance_name //由于参数instance_name是属于静态参数(alter system set
NAME TYPE VALUE instance_name='instest' scope=spfile;语句中带有scope=spfile就代表该
--------------------- -------- ----------- 参数为静态参数),而静态参数修改后的值要生效需要在数据库实例重启
instance_name string test 后,所以show parameter instance_name显示的值还是未修改前的值test。
SQL> show parameter db_name //说明不同的实例名可以对应同一个db_name
NAME TYPE VALUE
--------------------- -------- -----------
db_name string test
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
test OPEN
SQL> show parameter instance_name
NAME TYPE VALUE
--------------------- -------- -----------
instance_name string intest
我们发现,用show parameters语句能实时反应出数据库参数修改的变化,而用动态视图(数据字典表)v$instance则不能。要想动态视图能及时反应出现在数据库的变化,需要用一个更新语句来更新动态视图中的内容,具体是什么更新语句,我忘记了,大家可以自己查查看。
LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 24-SEP-2008 16:52:44
Uptime 0 days 0 hr. 1 min. 52 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test1)(PORT=1521)))
Services Summary...
Service "oratest" has 1 instance(s).
Instance "instest", status READY, has 1 handler(s) for this service...
Service "test" has 1 instance(s).
Instance "instest", status READY, has 1 handler(s) for this service...
Service "test_XPT" has 1 instance(s).
Instance "instest", status READY, has 1 handler(s) for this service...
The command completed successfully
可以看到,监听注册的服务和实例已发生了相应的变化。
由这里status命令显示的结果:
Service "oratest" has 1 instance(s).
Instance "instest", status READY, has 1 handler(s) for this service...
对比,未修改instance_name前的status命令显示的结果:
Service "test" has 1 instance(s).
Instance "test", status READY, has 1 handler(s) for this service...
我们可以知道,status命令显示的结果里说的Instance指的是instance_name,而非oracle_sid。
ORACLE_SID用于标示进程,而instance_name则用来标示实例,两者可以具有不同的名称。
此外Oracle的监听器(listener)配置文件中的SID_NAME就是来自instance_name参数,监听器通过instance_name才能确定需要将连接请求注册到哪一个实例上。通常listener.ora文件中SID_NAME相关设置类似如下示例:
SID_LIST_LISTENER = |
最后,还有一点要说明的是这里通过alter system set instance_name='instest' scope=spfile就可以修改instance_name的值,也就是说修改参数文件里的参数instance_name,说明参数文件里的参数instance_name最终决定实例名的值。不像db_name,虽然可以修改参数文件里的参数db_name,但是只要db_name值不是已经存在的数据库名,系统就会提示错误。也就是,db_name的值由创建数据库时语句create database database_name里的database_name值决定的,参数文件里的参数db_name不能随便取值。
附加:
证明instance_name和oracle_sid值可以不一样有两种方式:修改instance_name,如本文所述;修改oracle_sid,如《循序渐进Oracle——数据库管理、优化与备份恢复》里1.2.4 ORACLE_SID的含义(最后一个例子) 和 1.2.5 INSTANCE_NAME的含义及作用。但是对书里的例子有些疑问:
1.2.4 ORACLE_SID的含义(最后一个例子)里,为什么最后显示的instance_name(show parameter instance_name)还是为oracle_sid值?
而在1.2.5 INSTANCE_NAME的含义及作用 里为什么最后显示的instance_name(show parameter instance_name)又不是为oracle_sid值?