使用RMAN Duplicate方法搭建异名数据库实验(3)

7、RMAN duplicate过程

下面进行最关键的duplicate过程,注意,我们是从auxiliary入手处理。

[Oracle@SimpleLinuxUp dbs]$ export ORACLE_SID=oraaux

[oracle@SimpleLinuxUp dbs]$ rman nocatalog

Recovery Manager: Release 10.2.0.1.0 - Production on Wed Mar 5 10:27:49 2014

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

RMAN> connect target sys/oracle@oratest

connected to target database: ORATEST (DBID=3370560176)

using target database control file instead of recovery catalog

连接auxiliary数据库。

RMAN> connect auxiliary /       

connected to auxiliary database: ORAAUX (not mounted)

启动duplicate过程。

RMAN> duplicate target database to oraaux;

Starting Duplicate Db at 05-MAR-14

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: sid=431 devtype=DISK

contents of Memory Script:

{

set until scn  578677;

set newname for datafile  1 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_system_9k8m458j_.dbf";
 
  set newname for datafile  2 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_undotbs1_9k8m45bw_.dbf";
 
  set newname for datafile  3 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_sysaux_9k8m458q_.dbf";
 
  set newname for datafile  4 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_users_9k8m45c1_.dbf";
 
  set newname for datafile  5 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_example_9k8m458x_.dbf";
 
  restore

check readonly

clone database

;

}

executing Memory Script

(篇幅原因,有省略……)

contents of Memory Script:

{

Alter clone database open resetlogs;

}

executing Memory Script

database opened

Finished Duplicate Db at 05-MAR-14

如果可以顺利完成脚本过程,就可以实现启动数据库oraaux。

[oracle@SimpleLinuxUp ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 5 11:55:44 2014

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

SQL> conn / as sysdba

Connected.

SQL> select status from v$instance;

STATUS

------------

OPEN

注意,此时实例还是使用pfile启动,没有spfile。

SQL> show parameter spfile;

NAME                                TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                              string

SQL> create spfile from pfile;

File created.

重新启动,如果没有问题的话,就可以保证完成过程。

SQL> startup force;

ORACLE instance started.

Total System Global Area  247463936 bytes

Fixed Size                  1218772 bytes

Variable Size              83887916 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

ORA-00205: error in identifying control file, check alert log for more info

SQL> select status from v$instance;

STATUS

------------

STARTED

故障出现!

8、丢失的控制文件

从过程看,是启动在nomount之后数据库报错。在行为上,10g和11g有一些差异。如果是10g版本,Oracle会停止在错误发生之前的状态。在这个案例中,我们发现数据库停留在nomount状态。而11g环境中,系统多半会直接中断。
 
位置提示上,是控制文件出了问题。先看alert_log信息。

Wed Mar  5 11:59:41 2014

ALTER DATABASE  MOUNT

Wed Mar  5 11:59:41 2014

ORA-00202: control file: '/u01/app/oracle/product/10.2.0/db_1/dbs/cntrloraaux.dbf'
 
ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Wed Mar  5 11:59:44 2014

ORA-205 signalled during: ALTER DATABASE  MOUNT...

找不到文件!我们看系统给出的参数文件是什么内容。

SQL> show parameter control;

NAME                                TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time        integer    7

control_files                        string      /u01/app/oracle/product/10.2.0                                                /db_1/dbs/cntrloraaux.dbf
 
 

这个目录显然是给定的非OFA策略路径。到目录中,我们也找不到文件。

[oracle@SimpleLinuxUp dbs]$ ls -l | grep cntrl

[oracle@SimpleLinuxUp dbs]$

比较麻烦的情况,数据库都在,控制文件启动前运行良好。但是信息没有写入到参数文件control_files中。如何解决?

冷静想来,我们在initoraaux.ora中,是没有定义control_files参数的。在创建auxiliary数据库的过程中,我们是看得到create control file脚本的,说明在这个过程中是有控制文件生成。如果没有定义control_files参数,Oracle应该是使用OMF策略,在数据库目录和Recovery Area中创建两个对象。
 
在关闭数据库前,我们使用了create spfile from pfile的方法,这个过程中,Oracle可能依据的是一个旧的原则(OFA之前),设置了$ORACLE_HOME/dbs目录中的一个不存在的控制文件。再次启动,失败报错。
 
当务之急是想办法解决,这个思路下,两个OFA目录中应该是有控制文件对象。经过查找,也确定正确。

--oradata目录

[oracle@SimpleLinuxUp dbs]$ cd /u01/app/oracle/oradata/ORAAUX/controlfile/

[oracle@SimpleLinuxUp controlfile]$ ls -l

-rw-r----- 1 oracle oinstall 7389184 Mar  5 11:59 o1_mf_9kf80kq1_.ctl

-rw-r--r-- 1 oracle oinstall    742 Mar  5 10:54 sqlnet.log

--flashback Recovery目录

[oracle@SimpleLinuxUp controlfile]$ cd /u01/app/oracle/flash_recovery_area/

[oracle@SimpleLinuxUp flash_recovery_area]$ ls

ORAAUX  ORATEST

[oracle@SimpleLinuxUp flash_recovery_area]$ cd ORAAUX/

[oracle@SimpleLinuxUp ORAAUX]$ ls -l

total 12

drwxr-x--- 3 oracle oinstall 4096 Mar  5 11:54 archivelog

drwxr-xr-x 2 oracle oinstall 4096 Mar  5 11:54 controlfile

drwxr-x--- 2 oracle oinstall 4096 Mar  5 11:55 onlinelog

[oracle@SimpleLinuxUp ORAAUX]$ cd controlfile/

[oracle@SimpleLinuxUp controlfile]$ ls -l

-rw-r----- 1 oracle oinstall 7389184 Mar  5 11:59 o1_mf_9kf80kwj_.ctl

目录中的确存在控制文件对象,而且更可贵的是,时间戳相同,都是11:59。可以相信是相同的镜像。而且在OFA格式下,是不会存在混淆的。

下面需要做的,就是将spfile中的control_files参数修改掉。

SQL> alter system set control_files='/u01/app/oracle/oradata/ORAAUX/controlfile/o1_mf_9kf80kq1_.ctl','/u01/app/oracle/flash_recovery_area/ORAAUX/controlfile/o1_mf_9kf80kwj_.ctl' scope=spfile;
 
System altered.

重新启动数据库。

SQL> shutdown immediate;

ORA-01507: database not mounted

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  247463936 bytes

Fixed Size                  1218772 bytes

Variable Size              83887916 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

SQL> show parameter control_files

NAME                                TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_files                        string      /u01/app/oracle/oradata/ORAAUX                                              /controlfile/o1_mf_9kf80kq1_.c                                                tl, /u01/app/oracle/flash_reco                                                very_area/ORAAUX/controlfile/o                                                1_mf_9kf80kwj_.ctl
 
 

修改成功!至此duplicate数据库创建成功,与oratest完全相同。

这个问题,可能还有不同的处理策略。首先,我们可以在控制文件创建上放弃OMF,就在initoraaux.ora中制定一个简单名称的控制文件。这样就可以避免OMF在duplicate过程中报错。第二种方法是在我们成功启动open数据库中,不使用create spfile from pfile,而是从memory中创建spfile。在11g中,支持从运行的数据库memory中将参数转化为spfile。如果有这个策略,也许就不会出现控制文件参数问题了。
 
 

--10g中

SQL> create spfile from memory;

create spfile from memory

*

ERROR at line 1:

ORA-00922: missing or invalid option

--11g中

SQL> create spfile='/tmp/res.ora' from memory;

File created.

最后,这个问题的根源也许和Oracle有一定关系。duplicate结束之后,是否需要将正确的OMF文件路径设置在control_files参数,而不是一个过去值。很大可能也是一个Bug。
 
 

9、结论

复制数据库进行测试,是我们经常需要面对的需求。实现的方法有很多,简单的有exp/imp(expdp/impdp),复杂的有DG standby等。使用duplicate方法,是一种比较简单的方法,值得我们学习掌握。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1835b22663f69ea9006568e7d66f206f.html