修改instance_name的语句(alter system set instance_name)

动态注册不需要显示的配置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。

                                                                                         此时,若看lsnrctl status里的结果也是显示为 test。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE  instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area   96468992 bytes
Fixed Size                  1217884 bytes
Variable Size              88083108 bytes
Database Buffers            4194304 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

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 =
(SID_DESC =
(GLOBAL_DBNAME = eygle)
(ORACLE_HOME = /opt/oracle/product/9.2.0)
(SID_NAME = eygle)
)

             最后,还有一点要说明的是这里通过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值?

 

你可能感兴趣的:(INSTANCE_NAME)