在前两篇文章中描述了中小型数据库使用RMAN catalog设计备份与恢复方案,并给出了所有相关的脚本来从某种车程度上模拟Oracle Data Guard以减少硬件故障带来Prod服务器上数据库损失。在这边文章中主要描述Prod数据库的变迁在Bak server端如何进行恢复。
中小型数据库 RMAN CATALOG 备份恢复方案(一)
中小型数据库 RMAN CATALOG 备份恢复方案(二)
1、恢复前提
按照前两篇文章的描述,我们制定了每天做一个level 0级备份并ftp整个备份集到Bak server。同时定时ftp Prod的归档日志到Bak server。
其次是每天会对Bak server端的数据库做还原(restore)操作。因此对于Bak server实现数据恢复所要做的是应用归档日志(含定时ftp的归档日志)
将数据库刷新到最新时刻。对于备份如恢复的间隔也可自行定义,如每2天做一次。下面是恢复的前提条件,否则需要手动备份或还原。
使用RMAN备份脚本已经完成RMAN备份,且备份被ftp到备份服务器
使用RMAN恢复脚本已经在备份服务器成功进行了还原
2、Prod DB上准备测试数据
SQL> select * from v$version where rownum<2; BANNER ---------------------------------------------------------------- Oracle Database 10g Release 10.2.0.3.0 - 64bit Production SQL> select instance_name,host_name from v$instance; INSTANCE_NAME HOST_NAME ---------------- --------------------------------------------- Ak3210 N10db03p --为prod添加tablespace SQL> create tablespace tbs_tmp datafile '/u02/database/Ak3210/oradata/tbs_tmp.dbf' size 10m autoextend on; --基于新的tablespace添加表对象 SQL> create table xy(seq varchar2(20),who varchar2(20),dt varchar2(20)) tablespace tbs_tmp; --插入数据 SQL> insert into xy select 'FirstArch','Robinson',to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual; SQL> commit; --对当前日志归档 SQL> alter system archive log current; --下面是生成的归档日志 SQL> ho ls arch_818416637_1_157.arc --验证刚刚插入的记录是否存在于归档日志 SQL> ho strings arch_818416637_1_157.arc | grep "FirstArch" FirstArch --再次插入新的数据 SQL> insert into xy select 'SecnodArch','Jackson',to_char(sysdate,'yyyymmdd hh:mi:ss') from dual; SQL> commit; SQL> alter system archive log current; SQL> ho ls arch_818416637_1_157.arc arch_818416637_1_158.arc SQL> ho strings arch_818416637_1_158.arc | grep "SecnodArch" SecnodArch --Author : Robinson Cheng --Blog : http://blog.csdn.net/robinson_0612 --将归档日志文件复制到备份服务器 SQL> ho scp *.arc 192.168.250.101:/u02/database/Ak3210/archive arch_818416637_1_157.arc 100% 34MB 34.2MB/s 00:00 arch_818416637_1_158.arc 100% 12KB 12.0KB/s 00:00 --Prod数据库的归档情况,当前Log sequence是159 SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /u02/database/Ak3210/archive/ Oldest online log sequence 157 Next log sequence to archive 159 Current log sequence 159 SQL> col name format a60 SQL> set linesize 160 SQL> alter session set nls_date_format='yyyymmdd hh24:mi:ss'; -->查询归档日志 SQL> select name,sequence#,status,COMPLETION_TIME from v$archived_log where status='A'; NAME SEQUENCE# S COMPLETION_TIME ------------------------------------------------------------ ---------- - ----------------- /u02/database/Ak3210/archive/arch_818416637_1_157.arc 157 A 20130731 16:34:30 /u02/database/Ak3210/archive/arch_818416637_1_158.arc 158 A 20130731 16:35:42 SQL> select * from xy; SEQ WHO DT -------------------- -------------------- -------------------- FirstArch Robinson 20130731 16:34:15 SecnodArch Jackson 20130731 16:35:35
3、Bak Server上DB的恢复操作
oracle@BKDB01p:~> export ORACLE_SID=Ak3210 oracle@BKDB01p:~> rman target / catalog rman_user/rman@catadb --在备份服务器上连接target DB 及catalog DB Recovery Manager: Release 10.2.0.3.0 - Production on Wed Jul 31 16:39:45 2013 Copyright (c) 1982, 2005, Oracle. All rights reserved. connected to target database (not started) connected to recovery catalog database RMAN> startup mount; --->启动数据库到mount状态 RMAN> restore archivelog all; --->还原所有的归档日志 Starting restore at 20130731 16:41:35 allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=1090 devtype=DISK channel ORA_DISK_1: starting archive log restore to default destination channel ORA_DISK_1: restoring archive log archive log thread=1 sequence=156 channel ORA_DISK_1: reading from backup piece /u02/database/Ak3210/flash_recovery_area/Ak3210/backupset/ 2013_07_31/o1_mf_annnn_ARCHBK_8zkgnw5t_.bkp channel ORA_DISK_1: restored backup piece 1 piece handle=/u02/database/Ak3210/flash_recovery_area/Ak3210/backupset/2013_07_31/o1_mf_annnn_ARCHBK_8zkgnw5t_.bkp tag=ARCHBK channel ORA_DISK_1: restore complete, elapsed time: 00:00:02 channel ORA_DISK_1: starting archive log restore to default destination channel ORA_DISK_1: restoring archive log archive log thread=1 sequence=155 channel ORA_DISK_1: reading from backup piece /u02/database/Ak3210/flash_recovery_area/Ak3210/backupset/ 2013_07_31/o1_mf_annnn_ARCHBK_8zkgnw5l_.bkp channel ORA_DISK_1: restored backup piece 1 piece handle=/u02/database/Ak3210/flash_recovery_area/Ak3210/backupset/2013_07_31/o1_mf_annnn_ARCHBK_8zkgnw5l_.bkp tag=ARCHBK channel ORA_DISK_1: restore complete, elapsed time: 00:00:08 Finished restore at 20130731 16:41:46 RMAN> list copy; --->查看刚刚还原出来的日志文件 List of Archived Log Copies Key Thrd Seq S Low Time Name ------- ---- ------- - ----------------- ---- 34428 1 155 A 20130731 01:00:50 /u02/database/Ak3210/archive/arch_818416637_1_155.arc 34427 1 156 A 20130731 15:19:54 /u02/database/Ak3210/archive/arch_818416637_1_156.arc RMAN> catalog archivelog '/u02/database/Ak3210/archive/arch_818416637_1_157.arc'; --->将新的归档日志注册到catalog cataloged archive log archive log filename=/u02/database/Ak3210/archive/arch_818416637_1_157.arc recid=148 stamp=822242629 RMAN> catalog archivelog '/u02/database/Ak3210/archive/arch_818416637_1_158.arc'; cataloged archive log archive log filename=/u02/database/Ak3210/archive/arch_818416637_1_158.arc recid=149 stamp=822242639 RMAN> list copy; --->再次查看时,所有的归档日志已经位于归档目录 List of Archived Log Copies Key Thrd Seq S Low Time Name ------- ---- ------- - ----------------- ---- 34428 1 155 A 20130731 01:00:50 /u02/database/Ak3210/archive/arch_818416637_1_155.arc 34427 1 156 A 20130731 15:19:54 /u02/database/Ak3210/archive/arch_818416637_1_156.arc 34495 1 157 A 20130731 15:19:55 /u02/database/Ak3210/archive/arch_818416637_1_157.arc 34534 1 158 A 20130731 16:34:30 /u02/database/Ak3210/archive/arch_818416637_1_158.arc RMAN> run{ --->使用until方式恢复数据库,下面给出了错误提示 2> set until sequence 159; 3> recover database;} executing command: SET until clause Starting recover at 20130731 16:45:47 using channel ORA_DISK_1 starting media recovery archive log thread 1 sequence 155 is already on disk as file /u02/database/Ak3210/archive/arch_818416637_1_155.arc archive log thread 1 sequence 156 is already on disk as file /u02/database/Ak3210/archive/arch_818416637_1_156.arc archive log thread 1 sequence 157 is already on disk as file /u02/database/Ak3210/archive/arch_818416637_1_157.arc archive log thread 1 sequence 158 is already on disk as file /u02/database/Ak3210/archive/arch_818416637_1_158.arc RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 07/31/2013 16:45:51 RMAN-06053: unable to perform media recovery because of missing log RMAN-06025: no backup of log thread 1 seq 94 lowscn 2457942 found to restore RMAN> exit Recovery Manager complete. oracle@BKDB01p:~> export ORACLE_SID=Ak3210 oracle@BKDB01p:~> sqlplus / as sysdba --->下面在sqlplus进行恢复 SQL> recover database using backup controlfile; --->使用基于备份的控制文件恢复数据库 ORA-00279: change 2654259 generated at 07/31/2013 15:19:26 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_155.arc ORA-00280: change 2654259 for thread 1 is in sequence #155 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} auto --->输入auto,自动apply日志文件 ORA-00279: change 2654361 generated at 07/31/2013 15:19:54 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_156.arc ORA-00280: change 2654361 for thread 1 is in sequence #156 ORA-00278: log file '/u02/database/Ak3210/archive/arch_818416637_1_155.arc' no longer needed for this recovery ORA-00279: change 2654372 generated at 07/31/2013 15:19:55 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_157.arc ORA-00280: change 2654372 for thread 1 is in sequence #157 --->日志apply到157 ORA-00278: log file '/u02/database/Ak3210/archive/arch_818416637_1_156.arc' no longer needed for this recovery ORA-00283: recovery session canceled due to errors --->下面提示出现了一个未知的数据文件添加到控制文件 ORA-01244: unnamed datafile(s) added to control file by media recovery ORA-01110: data file 26: '/u02/database/Ak3210/oradata/tbs_tmp.dbf' ORA-01112: media recovery not started --->给出错误信息,提示介质恢复没有启动 SQL> ho ls /u02/database/Ak3210/oradata/tbs_tmp.dbf --->查看相应的数据文件,因为这个文件在备份服务器根本就不存在 ls: /u02/database/Ak3210/oradata/tbs_tmp.dbf: No such file or directory --->使用下面的命令来重建数据文件,为什么可以这样操作呢?这个是依赖于归档日志记录了这个数据文件 SQL> alter database create datafile 26 as '/u02/database/Ak3210/oradata/tbs_tmp.dbf'; Database altered. SQL> ho ls /u02/database/Ak3210/oradata/tbs_tmp.dbf --->再次查看数据文件已经存在了 /u02/database/Ak3210/oradata/tbs_tmp.dbf SQL> recover database using backup controlfile; --->再次恢复数据库 ORA-00279: change 2656873 generated at 07/31/2013 16:33:06 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_157.arc ORA-00280: change 2656873 for thread 1 is in sequence #157 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} auto --->输入auto ORA-00279: change 2656938 generated at 07/31/2013 16:34:30 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_158.arc ORA-00280: change 2656938 for thread 1 is in sequence #158 ORA-00278: log file '/u02/database/Ak3210/archive/arch_818416637_1_157.arc' no longer needed for this recovery ORA-00279: change 2656966 generated at 07/31/2013 16:35:42 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_159.arc ORA-00280: change 2656966 for thread 1 is in sequence #159 ORA-00278: log file '/u02/database/Ak3210/archive/arch_818416637_1_158.arc' no longer needed for this recovery ORA-00308: cannot open archived log '/u02/database/Ak3210/archive/arch_818416637_1_159.arc' --->寻找sequence为159的,实际上它是不存在的,所以找不到 ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 SQL> recover database using backup controlfile until cancel; --->再次恢复数据库 ORA-00279: change 2656966 generated at 07/31/2013 16:35:42 needed for thread 1 ORA-00289: suggestion : /u02/database/Ak3210/archive/arch_818416637_1_159.arc ORA-00280: change 2656966 for thread 1 is in sequence #159 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} cancel --->输入cancel Media recovery cancelled. SQL> alter database open resetlogs; --->以resetlogs方式open数据库 Database altered. SQL> select * from xy; --->验证结果,数据库恢复成功 SEQ WHO DT -------------------- -------------------- -------------------- FirstArch Robinson 20130731 16:34:15 SecnodArch Jackson 20130731 16:35:35 SQL> shutdown immediate; --->关闭数据库 oracle@BKDB01p:~> export ORACLE_SID=Ak3210 oracle@BKDB01p:~> rman target / catalog rman_user/rman@catadb --->再次连接到catalog RMAN> startup mount; --->启动到mount状态 Oracle instance started database mounted new incarnation of database registered in recovery catalog --->可以看到新的incarnation被注册到了catalog starting full resync of recovery catalog full resync complete RMAN> list incarnation; --->列出当前数据库的incarnation List of Database Incarnations DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time ------- ------- -------- ---------------- --- ---------- ---------- 357 358 Ak3210 1008246269 PARENT 1 20130618 09:57:17 357 34690 Ak3210 1008246269 CURRENT 2656967 20130731 16:54:39 RMAN> reset database to incarnation 358; --->重置当前数据库的incarnation database reset to incarnation 358 RMAN> resync catalog; --->同步的catalog RMAN> shutdown abort; 对于在Prod段删除表空间和数据文件的处理比添加较为简单,无需要单独处理。直接执行restore以及recover就可了。但是其对应的物理数据文件依旧 存在于OS系统之上,可以手动删除即可。
相关参考
中小型数据库 RMAN CATALOG 备份恢复方案(一)
基于RMAN的异机数据库克隆(rman duplicate)
基于RMAN从活动数据库异机克隆(rman duplicate from active DB)
RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154
Oracle 基于备份控制文件的恢复(unsing backup controlfile)