怎样在一个Oracle数据库中建立多个实例

前言:前两天,在接触一个新项目,他们的数据库框架,在一台机器上,当时别人交代是一个数据库两个实例(当前举例a,b),我看了看交接文档,那明明是一台机器,不是单机数据库吗?怎么有两个实例?登录相应的环境,查看了一下,刚开始登录,查看了监听,只有一个ASM实例的监听,没有数据库服务的监听,很是摸不着头脑,通过env |grep ORACLE查看当前的Oracle实例名和数据库的安装位置,查看tnsname.ora文件,他们配置是通过主机名配置的,明显service_name一样,仅仅是网络服务名不一样,这不是单机数据库吗?通过他们提供的用户名和密码还有连接串登录,死活登不上去,后来使用sys登录,也不加连接串,看看是默认登录什么环境吧,然后,登录进去了,查看了一个db_name(a),instance_name(a),dba_users再查看了他们提供的用户(a1,b1),只有一个用户,没有找到(b1),后来退出去,设置新的实例名为另外一个b,sys默认登录,发现db_name 是另外一个,instance_name是(b),从这就可以看出来了,他们这不是单机数据库,不是双实例,而是在一台服务器上建立了两个数据库,对应了两个实例,两个用户,现在大白了。

后来我寻思着,为什么会出现这样的乌龙,主要是感觉他们对这个db_name和instance_name认知不深刻,现在咱们理解一下这两个的意思,并且做一下练习。 

Oracle文档中对于db_name的定义:DB_NAME必须是一个不超过8个字符的文本串.在数据库创建过程中,db_name被记录在数据文件,日志文件和控制文件中。如果数据库实例启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动。一个实例可以mount并打开任何数据库,但是同一时间一个实例只能打开一个数据库。一个数据库可以被一个或多个实例所mount并打开(在OPS/RAC环境下,一个数据库可以被多个实例所打开).

查看我当前的数据库 

SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------------------------------------
/home/oracle/data/ORCL/datafile/o1_mf_system_fh03r5gl_.dbf
/home/oracle/data/ORCL/datafile/o1_mf_sysaux_fh03tr3w_.dbf
/home/oracle/data/ORCL/datafile/o1_mf_undotbs1_fh03w1tv_.dbf
/home/oracle/data/ORCL/datafile/o1_mf_users_fh03w2v3_.dbf

SQL> show parameter db_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      orcl
SQL> show parameter instance_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      orcl

      创建新的pfile文件,一下initapple.ora就是新建的文件

SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/12c/db
                                                 _1/dbs/spfileorcl.ora
SQL> create pfile='/u01/app/oracle/product/12c/db_1/dbs/initapple.ora' from spfile;

File created.

SQL> exit;
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@zxy ~]$ cd $ORACLE_HOME/dbs/
[oracle@zxy dbs]$ ls -l
total 24
-rw-rw----  1 oracle oinstall 1544 Oct 26 22:42 hc_orcl.dat
-rw-r--r--  1 oracle oinstall 1175 Jan 30 14:34 initapple.ora
-rw-r--r--. 1 oracle oinstall 3079 May 15  2015 init.ora
-rw-r-----  1 oracle oinstall   24 May  7  2018 lkORCL
-rw-r-----  1 oracle oinstall 3584 May  7  2018 orapworcl
-rw-r-----  1 oracle oinstall 3584 Nov  8 01:05 spfileorcl.ora

编辑新建的文件

[oracle@zxy dbs]$ vi initapple.ora 
##加入下面这条

instance_name=apple
[oracle@zxy dbs]$ grep name initapple.ora 
*.db_name='orcl'
instance_name=apple

这个时候pfile文件已准备好了,想要启动这个实例,那么首先先把之前的实例关闭掉,毕竟在同一时刻,单机数据库下,一个数据库只能打开一个实例,一个实例只能操纵一个数据库

[oracle@zxy dbs]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Jan 30 14:37:17 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@zxy dbs]$ export ORACLE_SID=apple
[oracle@zxy dbs]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Jan 30 14:38:35 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  587202560 bytes
Fixed Size                  8623352 bytes
Variable Size             306187016 bytes
Database Buffers          268435456 bytes
Redo Buffers                3956736 bytes
Database mounted.
Database opened.
SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------------------------------------
/home/oracle/data/ORCL/datafile/o1_mf_system_fh03r5gl_.dbf
/home/oracle/data/ORCL/datafile/o1_mf_sysaux_fh03tr3w_.dbf
/home/oracle/data/ORCL/datafile/o1_mf_undotbs1_fh03w1tv_.dbf
/home/oracle/data/ORCL/datafile/o1_mf_users_fh03w2v3_.dbf

SQL> show parameter db_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      orcl
SQL> show parameter instance_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      apple
SQL> 

当前新的实例apple启动了,数据库orcl也没变

我这当前只是练习,增加了一个是实例,通过这种方法,你可以创建多个,这,我就不一一演示了。

由以上可知,其实数据库,库仅仅 是一堆物理文件,一个“活”数据库,其实就是一个实例去操作一堆物理文件,把这些运行起来,其实就像一个鲜活的人似的,会思考,会运算,而这个就相当于大脑,大脑操纵身躯,联同协作。

补充:其实在实际生产环境中,这样的环境,存在的几率为1%,因为麻烦,单机数据库就是单机数据库,一个实例就是对应的数据库,你想要多个实例,你去建立RAC呀,你想要多个实例,多个库,你去建立DG呀,并且你要是建立在单机环境中建立其他实例,想要其他实例去操作,通过以上操作,实现的过程中,涉及数据库的重启,生产情况下,怎么能动不动关库呢,人家这业务还运行不运行了,可能都想哭了吧

你可能感兴趣的:(Oracle)