暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库的启动——DB_NAME与INSTANCE_NAME

原创 eygle 2019-12-19
922

相较INSTANCE_NAME参数来说,对于Oracle数据库更为重要的一个参数是DB_NAME。

DB_NAME代表了实例即将挂接的数据库名称,关系到具体的物理文件。通常缺省的数据库instance_name和db_name可以设置相同(在RAC环境下,由于多个实例对应一个数据库,所以instance_name和db_name不同)。

在创建数据库的过程中,图1是用于定义数据库名称(db_name)和影响INSTANCE_NAME的SID:

1.jpg
图1 数据库创建的标识定义页面

Oracle文档中对于db_name的定义如下
DB_NAME用来定义数据库名称,必须是一个不超过8个字符的文本串,在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。

此外常见的几个结论有:
1.一个实例可以mount并打开任何数据库,但是同一时间一个实例只能打开一个数据库

2.一个数据库可以被一个或多个实例所mount并打开(在OPS/RAC环境下,一个数据库可以被多个实例所打开)。

DB_NAME的另外一个作用是在监听器动态注册时作为缺省服务名注册,以下是Oracle 10g的动态注册监听示范:

Services Summary...
Service "julia" has 1 instance(s).
  Instance "eygle", status READY, has 1 handler(s) for this service...

通过下面的测试来看一下DB_NAME与数据库的关系。首先initeygle.ora文件代表了一个数据库实例:

[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
[oracle@jumper dbs]$ grep name initeygle.ora 
*.db_name='eygle'
*.instance_name='eygle'

这个实例以及当前数据库的相关参数如下:

SQL> show parameter db_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      eygle
SQL> show parameter instance_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      eygle

现在创建另外一个实例,通过复制创建一个pfile文件为名为julia这个新的实例使用:

[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
[oracle@jumper dbs]$ cp initeygle.ora initjulia.ora
[oracle@jumper dbs]$ ll init*
-rw-r--r--    1 oracle   dba           982 Jul 25 14:03 initeygle.ora
-rw-r--r--    1 oracle   dba           982 Jul 25 14:04 initjulia.ora

修改这个文件,更改instance_name参数,设置instance_name = julia,修改后的参数设置如下所示:

[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> 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 dbw
oracle   27323     1  0 Jul14 ?        00:00:00 ora_dbw0_eygle
oracle   15447     1  0 14:04 ?        00:00:00 ora_dbw0_julia
oracle   25030 25000  0 18:38 pts/2    00:00:00 grep dbw

关闭eygle这个数据库实例:

[oracle@jumper dbs]$ export ORACLE_SID=eygle
[oracle@jumper dbs]$ sqlplus "/ as sysdba"
SQL> shutdown immediate;

然后就可以通过实例julia加载并打开db_name=eygle的数据库了,这也就是前面所说的,一个数据库可以被任何一个实例挂接打开(当然是有条件限制的):

[oracle@jumper dbs]$ export ORACLE_SID=julia
[oracle@jumper dbs]$ sqlplus "/ as sysdba"
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
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'

在nomount环节不存在任何问题,而在mount阶段,数据库会对参数文件和控制文件进行比较,如果两者记录的db_name不一致,则数据库无法启动,错误提示指定的数据库名称和控制文件中记录的名称不符:

SQL> startup nomount;
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01103: database name 'EYGLE' in controlfile is not 'JULIA'
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论