1.2.8 db_name参数和instance_name参数
在启动实例后执行的创建数据库中,第一个语句就是“CREATE DATABASE "eygle"”,这是数据库最重要的开始,其中“"eygle"”也就是图1-4中定义的数据库名称。
对于Oracle数据库来说,db_name代表数据库的名称而instance_name代表实例的名称,instance_name通过参数文件即可修改,而db_name则不然,来看一下Oracle对于数据库名称的定义:DB_NAME必须是一个不超过8个字符的文本串。在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。
通过以上定义可以看到,db_name是最具有稳定意义的参数,在数据文件、日志文件和控制文件中都会记录数据库的名称,这个名称完全可以不同于instance_name。
以下的测试数据库拥有相同的db_name和instance_name:
[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
[oracle@jumper dbs]$ grep name initeygle.ora
*.db_name='eygle'
*.instance_name='eygle'
创建一个新的pfile为julia这个新的实例使用:
[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
[oracle@jumper dbs]$ cp initeygle.ora initjulia.ora
修改这个文件更改instance_name参数:
[oracle@jumper dbs]$ grep name initjulia.ora
*.db_name='eygle'
*.instance_name='julia'
然后启动实例名称为julia的instance:
[oracle@jumper dbs]$ export ORACLE_SID=julia
[oracle@jumper dbs]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:04:15 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 139531744 bytes
Fixed Size 452064 bytes
Variable Size 121634816 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode
注意:此时试图加载数据库时出现错误,因为当前数据库被另外一个实例(instance)加载。在非并行模式(OPS/RAC)下,一个数据库同时只能被一个实例加载。
此时已经启动了两个数据库实例,从后台进程可以看出:
[oracle@jumper dbs]$ ps -ef|grep ora_pmon
oracle 27321 1 0 Jul14 ? 00:00:00 ora_pmon_eygle
oracle 15445 1 0 14:04 ? 00:00:00 ora_pmon_julia
oracle 15459 15391 0 14:04 pts/2 00:00:00 ps -ef
oracle 15460 15391 0 14:04 pts/2 00:00:00 grep ora_pmon
关闭eygle这个数据库实例后,就可以通过实例julia加载并打开db_name=eygle的数据库了:
[oracle@jumper dbs]$ export ORACLE_SID=julia
[oracle@jumper dbs]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 25 14:05:06 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
……
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
SQL> alter database open;
Database altered.
SQL> select name from v$datafile;
NAME
----------------------------------------------------------------------------
/opt/oracle/oradata/eygle/system01.dbf
/opt/oracle/oradata/eygle/undotbs01.dbf
/opt/oracle/oradata/eygle/users01.dbf
/opt/oracle/oradata/eygle/eygle01.dbf
新的实例具有独立的instance_name和db_name参数设置:
SQL> ! ps -ef|grep ora_pmon
oracle 15445 1 0 14:04 ? 00:00:00 ora_pmon_julia
oracle 15515 15513 0 14:05 pts/2 00:00:00 /bin/bash -c ps -ef|grep ora
oracle 15516 15515 0 14:05 pts/2 00:00:00 ps -ef
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string julia
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string eygle
再看看如果参数文件中的db_name和控制文件中的db_name不一致会出现什么错误。修改参数文件中的db_name参数:
[oracle@jumper dbs]$ grep name initjulia.ora
*.db_name='julia'
*.instance_name='julia'
在启动过程中,可以看到,在mount阶段,数据库会对参数文件和控制文件进行比较,如果两者记录的db_name不一致,则数据库就无法启动:
SQL> startup nomount;
ORACLE instance started.
<...ignore SGA info here...>
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01103: database name 'EYGLE' in controlfile is not 'JULIA'
总结一下,一个实例(instance_name)可以mount并打开任何数据库(db_name),但是同一时间一个实例只能打开一个数据库;一个数据库(db_name)同一时间可以为任一实例(instance_name)所打开,但是在非OPS/RAC情况下,同时只能被同一个实例所打开。






