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

Oracle数据库的启动——Mount相同db_name的数据库

原创 eygle 2019-12-25
1022

我们知道,在同一台数据库服务器上,可以启动多个具有相同实例名称的实例,那么在同一主机上是否可以启动具有相同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.png
图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退出,则数据库将异常中断。

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

评论