我们知道,在同一台数据库服务器上,可以启动多个具有相同实例名称的实例,那么在同一主机上是否可以启动具有相同db_name的数据库呢?如果可以,我们就可以在同一台服务器上Clone出一个备用数据库(Standby Database),用于测试或基于时间点的恢复等操作。
答案当然是可以的,但是在同一主机打开相同DB_NAME的数据库需要设置另外一个参数,在Oracle 9i中这个参数是lock_name_space,而在Oracle 10g中引入了db_unique_name参数替代了原来的lock_name_space。
以下测试来自Oracle 9iR2,首先获得原数据库的控制文件创建脚本:
SQL> alter database backup controlfile to trace;
Database altered.
然后关闭初始数据库(此处是ORACLE_SID为eygle的数据库),意图复制为目标ORACLE_SID是julia的数据库。
[oracle@jumper oradata]$ cp -R eygle julia
[oracle@jumper oradata]$ ls -l
drwxr-xr-x 2 oracle dba 4096 Feb 16 11:03 eygle
drwxr-xr-x 2 oracle dba 4096 Feb 16 13:15 julia
为新实例创建口令及参数文件:
[oracle@jumper dbs]$ ll *eygle*
-rw-r--r-- 1 oracle dba 898 Feb 16 13:10 initeygle.ora
-rwSr----- 1 oracle dba 1536 Jan 13 19:39 orapweygle
-rw-r----- 1 oracle dba 2560 Feb 16 13:10 spfileeygle.ora
[oracle@jumper dbs]$ orapwd file=orapwjulia password=oracle entries=5
[oracle@jumper dbs]$ cp spfileeygle.ora spfilejulia.ora
更改参数:
[oracle@jumper dbs]$ export ORACLE_SID=julia
[oracle@jumper dbs]$ sqlplus "/ as sysdba"
SQL> startup nomount;
SQL> show parameter control
NAME TYPE VALUE
------------------------------ ------- -----------------------------------------
control_file_record_keep_time integer 7
control_files string /opt/oracle/oradata/eygle/control01.ctl
SQL> alter system set control_files='/opt/oracle/oradata/julia/control01.ctl' scope=spfile;
System altered.
SQL> alter system set lock_name_space=julia scope=spfile;
System altered.
关闭实例,重新创建控制文件:
SQL> startup nomount;
SQL> CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETLOGS ARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 1134
8 LOGFILE
9 GROUP 3 '/opt/oracle/oradata/julia/redo03.log' SIZE 1M,
10 GROUP 4 '/opt/oracle/oradata/julia/redo04.dbf' SIZE 1M,
11 GROUP 5 '/opt/oracle/oradata/julia/redo05.dbf' SIZE 1M
12 -- STANDBY LOGFILE
13 DATAFILE
14 '/opt/oracle/oradata/julia/system01.dbf',
15 '/opt/oracle/oradata/julia/undotbs01.dbf',
16 '/opt/oracle/oradata/julia/eygle01.dbf'
17 CHARACTER SET ZHS16GBK;
Control file created.
SQL> alter database open;
Database altered.
SQL> select name from v$datafile;
NAME
---------------------------------------------------------------------------
/opt/oracle/oradata/julia/system01.dbf
/opt/oracle/oradata/julia/undotbs01.dbf
/opt/oracle/oradata/julia/eygle01.dbf
关闭数据库,修改原实例eygle的参数:
SQL> alter system set lock_name_space=eygle scope=spfile;
System altered.
启动eygle数据库:
[oracle@jumper udump]$ export ORACLE_SID=eygle
[oracle@jumper udump]$ sqlplus '/ as sysdba'
SQL> startup
Database opened.
接下来启动julia实例:
[oracle@jumper udump]$ export ORACLE_SID=julia
[oracle@jumper udump]$ sqlplus '/ as sysdba'
SQL> startup
Database opened.
这样在同一台服务器上,就同时拥有了db_name和instance_name完全相同的两个数据库,当然,如果要真正使用这两个数据库,参数文件中还有一些路径需要修改。
在Windows上,情况与Linux/Unix上类似,Windows上的Oracle环境依赖于服务而存在:

图1 Windows中的服务属性
我们注意到Oracle环境的初始化是通过ORACLE.EXE eygle来完成的,至于实例和数据库是否随服务启动要依赖于注册表中的设置。
通过手动在命令行执行类似命令可以初始化任意的Oracle环境:
C:\>oracle julia
Press CTRL-C to exit server:
此后就可以连接到这个环境启动实例:
C:\>set ORACLE_SID=julia
C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 2月 17 10:11:13 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已连接到空闲例程。
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file 'C:\ORACLE\10.2.0\DATABASE\INITJULIA.ORA'
当然我们还需要创建参数文件和口令文件等:
C:\>cp c:\oracle\10.2.0\database\SPFILEEYGLE.ORA
c:\Oracle\10.2.0\database\spfilejulia.ora
C:\>orapwd file=c:\oracle\10.2.0\database\PWDjulia.ora password=oracle entries=5
此后,实例可以顺利启动,并可以挂接和打开数据库:
C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 2月 17 10:13:10 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已连接到空闲例程。
SQL> startup nomount;
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ---------------------- ---------------
instance_name string julia
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------- ------------------ ------------------------------
db_name string eygle
SQL> alter database mount;
数据库已更改。
SQL> alter database open;
数据库已更改。
如果在环境窗口CTRL+C退出,则数据库将异常中断。




