RMAN - 备份与恢复实践
1 RMAN备份与恢复实践
1.1 备份
1.1.1 对数据库进行全备
使用backup database命令执行备份
RMAN> BACKUP DATABASE;
执行上述命令后将对目标数据库中的所有数据文件进行备份,由于没有显式指定FORMAT参数,rman会自动为每个备份片段命名,并保存在ORACLE_HOME/database目录下。
当然,也可以通过显式指定format参数来自定义备份片段的命令规则,比如:
RMAN> BACKUP DATABASE FORMAT 'D:\BACKUP\%U';
1.1.2 备份表空间
只要实例启动并处于加载状态,不论数据库是否打开,都可以在rman中对表空间进行备份,而且不需要像手动备份那样先'ALTER TABLESPACE ... BEGIN BACKUP'。例如:
RMAN> backup tablespace jweb;
同样,我们在使用backup tablespace也可以通过显式指定format参数自定义备份片段名称。
我们再通过LIST BACKUP 查看一下备份:
RMAN> LIST BACKUP OF TABLESPACE JWEB;
1.1.3 备份指定数据文件
首先可以先通过数据字典DBA_DATA_FILES查询出表空间对应的数据文件及其序号,例如:
select file_name,file_id,tablespace_name from dba_data_files
然后再通过BACKUP DATAFILE备份指定序号的数据文件,例如:
RMAN> BACKUP DATAFILE n;
如果要查看指定数据文件的备份,可以用:
RMAN> LIST BACKUP OF DATAFILE n;
注:n=指定的的数据文件序号,如果需要备份的数据文件有多个,n=多个序号,中间以逗号分隔即可。
1.1.4 备份控制文件
控制文件在ORACLE中的重要性是毋庸置疑的,你看,连RMAN都给予特殊的照顾,在RMAN中备份控制文件的方式是最多的。
1.最简单的方式,通过CONFIGURE命令将CONTROLFILE AUTOBACKUP置为ON。
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
然后你再通过rman做任何备份操作的同时,都会自动对控制文件做备份。
2.对编号为1的数据文件,即SYSTEM表空间的数据文件做备份时,RMAN也会自动对控制文件做备份。
3.手动执行备份命令。
RMAN> BACKUP CURRENT CONTROLFILE;
4.执行BACKUP时指定INCLUDE CURRENT CONTROLFILE参数,例如:
RMAN> BACKUP DATABASE INCLUDE CURRENT CONTROLFILE;
如果要查看备份的控制文件,可以通过:
RMAN> LIST BACKUP OF CONTROLFILE;
1.1.5 备份归档日志文件
归档日志对于数据库介质恢复相当关键,其虽然不像控制文件那样一旦损坏则数据库马上崩溃但重要性丝毫不减。归档日志文件能确保我们将数据库恢复到备份之前的任意时刻。在RMAN中备份归档日志有两种方式:
1、利用BACKUP ARCHIVELOG命令备份
RMAN> BACKUP ARCHIVELOG ALL;
2、在BACKUP过程中利用PLUS ARCHIVELOG参数备份,例如:
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
则在备份数据库的同时自动对所有归档文件进行备份。这种方式与上种有什么区别呢,区别太明显了,BACKUP.....PLUS ARCHIVELOG命令在备份过程中会依次执行下列步骤:
1>.运行ALTER SYSTEM ARCHIVE LOG CURRENT语句对当前redolog进行归档。
2>.执行BACKUP ARCHIVELOG ALL命令备份所有已归档日志。
3>.执行BACKUP命令对指定项进行备份。
4>.再次运行ALTER SYSTEM ARCHIVE LOG CURRENT对当前redolog归档。
5>.对新生成的尚未备份的归档文件进行备份。
在完成归档日志文件备份后,我们通过需要删除已备份过的归档文件(归档文件记录下了数据库进行过的所有操作,如果您的数据库操作频繁而且量大,那归档文件大小也是相当恐怖,备份后删除释放存储空间是相当有必要地)。RMAN提供了DELETE ALL INPUT参数,加在BACKUP命令后,则会在完成备份后自动删除归档目录中已备份的归档日志。
完成备份之后,可以通过下列命令查看已备份的归档日志片段:
RMAN> LIST BACKUP OF ARCHIVELOG ALL;
1.1.6 建立增量备份
如果数据库运行于不归档模式下,那么你只能在数据库干净关闭的情况下(以NORMAL、IMMEDIATE、TRANSACTIONAL方式关闭)才能进行一致性的增量备份,如果数据库运行于归档模式下,那即可以在数据库关闭状态进行,也可以在数据库打开状态进行备份。再次说明了打开归档模式的优势,归档日志也就是多占些磁盘空间,好处不是一些是很多,可是也相当于又给数据库加了层保险啊。
建立增量备份也是相当简单,实质就是一个参数INCREMENTAL LEVEL=n,在执行BACKUP命令时加上即可,例如,建立一个增量级别0的全库备份:
RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE;
再例如,建立一个增量级别1的users01.dbf数据文件备份
RMAN> BACKUP INCREMENTAL LEVEL=1 TABLESPACE SYSTEM DATAFILE 'F:\ORAHOME1\ORADATA\JSSWEB\USERS01.DBF';
注:Rman默认创建的增量备份是Differential方式,如果要建立Cumulative方式的增量备份,在执行BACKUP命令时显式指定即可,例如:
RMAN> BACKUP INCREMENTAL LEVEL=2 CUMULATIVE DATABASE;
关于增量备份概念性解释,比如Differential与Cumulative两种方式间的区别请参考本篇外传,括弧,外传整理中,如果您看到本篇的时候外传还没出,这个。。。。表着急,耐心等候,面包牛奶都会有的。
1.1.7 建立冗余备份
RMAN提供了一种更谨慎的备份策略:Duplexed方式备份,其实质即是在生成备份集的同时,向指定位置生成指定份数(最大不超过4份)的备份集复制,以避免在灾难性事故时数据库损坏和备份丢失的情况下导致完全崩溃,提高备份可用性。当然,这是人类美好的愿意,对于那些没有异机异地备份条件的,假如机房发生火灾、地震之类大灾难,就算dba把备份文件复制了100份也照样玩完,上述是个假设,万勿对号入座,火灾、地震也不是哪都会发生地,大家好好活着,别害怕。
RMAN中提供了三种方式实现Duplexed方式备份:
1、在RMAN中执行BACKUP命令时显式指定COPIES参数。例如:
RMAN> BACKUP COPIES 3 DATABASE;
上述命令将会在全库备份的同时,自动生成当前备份集的2份拷贝到默认备份目录。
2、在RUN{}命令块中利用SET BACKUP COPIES命令为该命令块中所有的BACKUP命令设置Duplexed方式,例如:
RMAN> RUN{
2>SET BACKUP COPIES 2;
3>BACKUP DEVICE TYPE DISK FORMAT 'D:\BACKUP1\%U','D:\BACKUP2\%U'
4>TABLESPACE USERS,SALES;
5>}
上述命令将生成两份备份集,分别存储到d:\backup1和d:\backup2目录。
3、通过CONFIGURE ..... BACKUP COPIES命令设置预定义的备份Duplexed方式。
CONFIGURE ... BACKUP COPIES命令可以为指定的设备类型设置默认的备份拷贝数量。这个配置仅适用于数据文件与归档重做日志文件和备份,并且,只有在使用自动分配的通道时才能够使用CONFIGURE ... BACKUP COPIES命令设置的配置。例如:
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;
RMAN> CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE disk TO 2;
RMAN> CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE disk TO 2;
上述命令将disk设置上数据文件与归档文件的拷备数量设置为2,当再执行BACKUP DATABASE备份时,即会自动生成2份数据文件的备份集。
1.1.8 编写rman批处理文件
保存至:E:\oracleScript\backup\database_backup_jssweb.rman
RUN {
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'd:/backup/%F';
ALLOCATE CHANNEL CH1 DEVICE TYPE DISK FORMAT 'd:/backup/%U';
BACKUP DATABASE SKIP INACCESSIBLE FILESPERSET 10
PLUS ARCHIVELOG FILESPERSET 20
DELETE ALL INPUT;
RELEASE CHANNEL CH1;
}
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK;
CROSSCHECK BACKUPSET;
DELETE NOPROMPT OBSOLETE;
上述的各项命令均在前面几个章节中提到过,如果有看着眼生的话,再回去翻翻前面。命令是都知晓地,可能有几个参数会不明白其意义,比如:BACKUP命令中的SKIT INACCESSIBLE参数,大家表着急,静心等候俺的外。外外。。外外外。。。。(大锅,看个笔记而已,您不用拎着把菜刀到处晃吧,你你你,你别过来,我说还不成嘛)en,看到大家如此虔诚,俺就提前透露这部分内容吧。
SKIP选项 说明
SKIP INACCESSIBLE:表示跳过不可读的文件。我们知道一些offline的数据文件只要存在于磁盘上就仍然可被读取,但是可能有些文件已经被删除或移到它处造成不可读,加上这个参数就会跳过这些文件;
SKIP OFFLINE:跳过offline的数据文件;
SKIP READONLY:跳过那些所在表空间为read-only的数据文件;
1.2 恢复
首先注意:rman备份的时候并不会备份临时表空间的数据文件(想想也是,反正是临时的,备它干嘛),所以完全恢复之后,如果临时表空间的数据文件也丢失,需要手工重新创建临时表空间的数据文件。据消息灵通人士称,10G之后的版本会在恢复过程中自动创建临时表空间的数据文件,手头没有环境(11g都出了,俺还在学9i,落后啊。),未经尝试,有心的朋友如果落实该消息,也不妨通知俺一下:)
其次需要了解:Oracle数据库的恢复实际上包含了两个概念:数据库修复(RESTORE)与数据库恢复(RECOVER):
数据库修复:是指利用备份的数据库文件来替换已经损坏的数据库文件或者将其恢复到一个新的位置。RMAN在进行修复操作时,会利用恢复目录(没有建立恢复目录的话就使用目标数据库的控制文件)来获取备份信息,并从中选择最合适的备份进行修复操作。选择备份时有两个原则(1、选择距离恢复目录时刻最近;2、优先选择镜像复制,其次才是备份集)
数据库恢复:是指利用重做日志或增量备份来重建丢失的数据。
1.2.1 对数据库进行完全介质恢复
过程有三个步骤:
1、启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
2、执行恢复操作(记的我们刚说过的,恢复分两步,有先有后的。)
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACE TEMP;
注意:DELETE ARCHIVELOGS和SKIP TABLESPACE两个参数是可选择的,作用如下:
DELETE ARCHIVELOGS:表示RMAN将在完成恢复过程后自动删除那些在恢复过程中修复的归档日志文件。
SKIP TABLESPACE:跳过指定表空间,比如临时表,当然临时表空间即使你不跳过它也不会恢复的。
3、打开数据库
RMAN> ALTER DATABASE OPEN;
此处需要注意的一点是,如果你的数据库并非处于归档模式,那么必须使用ALTER DATABASE OPEN RESETLOGS来打开数据库,因为RMAN会认为在非归档模式下是一个不一致的备份,执行resetlogs之后,oracle将会把scn重新置为0。
1.2.2 恢复表空间
同样也可以分成三个步骤:
1、启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
2、进行恢复操作,在恢复之前,如果需要被恢复的表空间未处于脱机状态,需要通过alter tablespace ... Offline语句将其置为脱机:
RMAN> SQL 'ALTER TABLESPACE jweb OFFLINE IMMEDIATE';
RMAN> RESTORE TABLESPACE jweb;
RMAN> RECOVER TABLESPACE jweb;
RMAN> SQL 'ALTER TABLESPACE jweb ONLINE';
3、打开数据库
RMAN> ALTER DATABASE OPEN;
1.2.3 恢复数据文件
事实上,恢复表空间实际就是恢复其所对应的数据文件(一个表空间可能对应多个数据文件),所以步骤与上相似。
1、启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
2、进行恢复操作,在恢复之前,如果需要被恢复的表空间未处于脱机状态,需要通过alter tablespace ... Offline语句将其置为脱机,操作数据文件时可以直接指定数据文件,也可以以数据文件序号代替:
RMAN>SQL 'ALTER DATABASE DATAFILE 10 OFFLINE;
RMAN> RESTORE DATAFILE 10;
RMAN> RECOVER DATAFILE 10;
RMAN>SQL ' ALTER DATABASE DATAFILE 10 ONLINE;
3、打开数据库
RMAN> ALTER DATABASE OPEN;
1.3 高级恢复
不完全恢复
不完全恢复是指不完全的数据恢复,不完全恢复与完全恢复在许多方面是相同的,他们基本的命令集相同,但不完全恢复添加了一些其他命令。 引起不完全恢复的原 因有很多,如丢失了联机重做日志或归档的重做日志,或者出现重大的用户错误。 不完全恢复会影响整个数据库,换句话,不能只对数据库的一部分执行不完全恢 复操作,因为这个会使数据库的一部分具有与这个数据库其余部分不同的SCN和时间点。
要将数据库数据还原到与数据库剩余部分不同的时间点,可以用基于 表空间时间恢复 或者用 闪回技术。
不完全恢复方法包括:基于时间,SCN,日志序列 或取消的恢复。
1.3.1 建立恢复点
使用RMAN执行不完全恢复操作时需要完成一个工作是简历恢复目标。恢复目录是恢复进程的终点,通常我们基于一个时间点,一个指定的SCN 或者 一个日志序列号来表示它。 我们可以采用许多不同的方法建立恢复目标。
1.3.1.1 在run 代码块中使用set 命令与until time,until SCN 或 until sequence参数
Run
{
Set until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";
Restore database;
Recover database alter database open resetlogs;
}
执行这条命令时,RMAN 会查找与恢复目标时间最近(并非恢复目标时间本身也不能是位于恢复目标之间的时间)的备份集,并且从这个备份集中还原数据库。 如果数据库置于noarchivelog 模式中,恢复操作会在备份集的时间停止;否则在执行recover命令期间,oracle 会在所定义的恢复目标(不包含恢复目标本身)上应用归档的重做日志(以及需要应用的任何增量备份)。
注意: 如果尝试恢复到特定备份的完成点,则必须恢复到备份集中文件的CKP SCN 或 CKP TIME,在不同备份集的RMAN list命令中会列出这些内容。 有时使用备份的CKP TIME 并不够,还可能导致ORA-1152错误。
1.3.1.2 在restore 和recover 命令中直接使用until time,until SCN 和 until sequence 参数
这种方法避免使用run 代码块,也倾向与使用这种方法。
Startup mount;
Restore database until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";
Recover database until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";
Alter database open resetlogs;
1.3.2 基于时间的恢复
这种恢复类型允许用户将数据库恢复到与指定时间一致的状态。 当然,如果不存在能将数据库还原到用户请求的时间的有效备份或归档重做日志,Oracle 就会报RMAN-03002 和 RMAN-20207的错误。
必须具备在我们指定的恢复时间之前生成的数据库备份,此外还需要所有归档的重做日志。
1.3.3 基于SCN 的恢复
Oracle 允许用户将数据库恢复到指定的SCN,实际上,这并不是一种常见的恢复方法。示例如下:
Startup mount;
Restore database until SCN 1000;
Recover database until SCN 1000;
Alter database open resetlogs;
注意: 该示例可以将数据库还原到SCN 1000,但是不会包含SCN.
1.3.4 基于日志序列的恢复
RMAN 允许用户将数据库恢复到指定序列号的归档重做日志。如果归档的重做日志中存在间隙,使用这种恢复方法就非常方便。 间隙通常意味着我们只能将数据库还原到间隙的开始点。
Startup mount;
Restore database until sequence 100 thread 1;
Recover database until sequence 100 thread 1;
Alter database open resetlogs;
1.3.5 只读表空间的恢复
在默认情况下,即使丢失了只读的数据文件,RMAN也不会在执行完全恢复数据库还原操作时还原只读的数据文件。 要在完全恢复期间还原只读的数据文件,就必须在restore 命令中使用check readonly 参数,如:
Restore database check readonly;
注意,执行recover tablespace或recover datafile命令时,RMAN的工作情况是不一样的。 使用这两个命令时,不管表空间是否为只读状态都会执行恢复操作。
1.3.6 归档重做日志的还原
在使用RMAN的普通恢复过程中,不必恢复归档的重做日志。 不过,偶尔也会要求还原一个或多个归档的重做日志。 例如,我们可能需要使用LogMiner 在备份中存储的归档重做日志文件里查找一些信息。
Restore archivelog all;
Restore archivelog from logseq=20 thread=1;
Restore archivelog from logseq=20 until logseq=30 thread=1;
还可以将归档的重做日志还原到默认位置以外的位置上:
Run
{
Set archivelog destination to "d:/arch";
Restore archivelog all;
}
注意:1. 上例中的set 命令没有替代方法,必须要求使用set。
2. 如果RMAN 认为一个归档的重做日志已存在,就不会在磁盘上还原这个归档的重做日志,即使设置的还原位置不同与默认的归档日志位置,Oracle 也不会在这个新的位置上恢复归档的重做日志。
1.3.7 数据文件副本的还原
可以从数据文件副本(不是备份集)中还原数据库的数据文件。 要实现这个功能,需要先使用restore from datafilecopy命令,然后再使用恢复数据库(或表空间,数据文件)的recover。
RMAN>Restore (datafile 5) from datafilecopy; -- 此处的圆括号是必须的,如果没有就报错
RMAN>Recover datafile 5;
SQL>Alter database datafile 5 online;
执行restore 时,该命令会识别需要还原的数据文件的最新副本,然后从这个副本中还原这些数据文件。 数据文件的最新副本可能是在一个数据文件副本中,而不是在一个副本中。 在这种情况下,Oracle 会恢复这个数据文件副本。
1.3.1 使用resetlogslogs 命令
在不完全恢复期间,通常需要使用resetlogs命令打开数据库,这是因为我们要从已经简历的现有日志流中脱离出来,并且需要向Oracle 说明这种情况. Resetlogs 命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始. 数据库的逻辑生存期也称为一个对应物(Incarnation). 每次使用resetlogs命令都会创建一个新的数据库对应物,这对于恢复操作来说非常重要.
每次使用resetlogs命令时,SCN 计数器不会被重置,不过Oracle 会重置其他计数器(如:日志序列号),同时还会重置联机重做日志的内容.
Oracle 10g 简化了通过resetlogs命令进行的恢复,在归档的重做日志名中添加了一个新的特换串(%r),该字符串表示resetlog ID 号。在log_archive_dest_format 参数串中包括%r时,归档的重做日志名在每个resetlogs 命令中保持唯一。这种改动以及其他的内部Oracle 数据库改动使oracle 可以很容易的通过给定的resetlogs操作恢复数据库。因此,可以很容易的在执行操作后立刻备份数据库,然而,我们仍然认为在任何不完全恢复后备份数据库是很有必要的。
1.3.2 恢复讹误的数据块
即使与讹误数据块关联的数据文件一直联机,也可以通过用块介质恢复(block Media recover: BMR)执行块级别恢复操作来修复Oracle 数据库中的这些逻辑上或者物理上的讹误数据块。
一般出现数据块错误时,都会有错误消息:
ORA-01578: ORACLE data block corrupted (file #18,block #88)
如果没有BMR时,我们必须从一个备份中恢复这个数据文件,在恢复过程中,用户不能使用该数据块文件中的所有数据。
用BMR恢复就很简单,只需要执行blockrecover命令即可:
Blockrecover datafile 18 block 88;
如果有必要,可以同时恢复多个数据文件的多个数据块。如:
Blockrecover datafile 18 block 16,17,88,108;
Blcokrecover datafile 18 block 88 datafile 19 blcok 188;
Oracle 会跟踪在备份和恢复期间发生的数据块讹误。如果检测到备份或复制操作出现讹误,由于Oracle 不允许在备份中出现讹误,所有这个备份就会失败。 当然,可以配置RMAN允许一定数量的讹误,但是不推荐这种用法。
可以使用backup validate database 命令查看RMAN 检测到的所有数据库讹误。这条命令会在v$backup_corruption 和v$database_block_corruption视图中填充检测到的所有讹误数据块。 如果讹误发生在复制操作期间,v$copy_corruption视图就会指明包含讹误的备份集。
注意的是:v$backup_corruption 是一个显示历史讹误的视图,v$database_block_corruption 则是一个显示当前数据块讹误的视图。 一旦修正了数据库的块讹误,就需要重新运行backup validate database命令,然后查询v$database_block_corruption 视图以确保不存在其他讹误。
查询v$database_block_corruption视图可以查看讹误数据块的详细信息。 如下所示,使用具有corruption list restore 参数的blockrecover命令可以方便地修正v$database_block_corruption 视图中的讹误数据块。
Blockrecover corruption list restore until time 'SYSDATE-5';
这条命令将还原讹误列表中最近5天的所有讹误数据块。 在上面的命令中,还可以使用until time 和 until sequence.
1.3.3 恢复前一个对应物
一个数据库的对应物(incarnation)对应这个数据库的特定逻辑生存期。 有时我们需要使用上次执行resetlogs命令打开数据库前生成的一个备份来还原数据库,或者可能需要还原到执行上一个resetlogs命令之前的时间点。 这就需要用到incarnation.
1.3.3.1 使用恢复目录恢复前一个对应物
先假设使用恢复目录执行了备份操作,并且最近使用了resetlogs命令执行过时间点恢复,现在需要使用执行resetlogs命令之前的一个备份来恢复数据库。
操作步骤:
(1)启动但不加载实例,这是因为我们要先得到一个与恢复数据库对应物关联的控制文件
(2)使用reset database to incarnation 命令为RMAN 指示对应物的备份集。
(3)Restore controlfile,使rman还原最新的控制文件
(4)加载数据库
(5)Restore 数据库
(6)Recover 数据库
(7)使用resetlogs 打开数据库
示例如下:
C:/Users/Administrator.DavidDai>rman target / catalog rman/rman@orcl;
RMAN> list incarnation;
RMAN> startup force nomount;
RMAN> reset database to incarnation 4;
RMAN> restore controlfile;
RMAN> alter database mount;
RMAN> restore database until scn 940990;
RMAN> recover database until scn 940990;
RMAN> alter database open resetlogs;
1.3.3.2 不使用恢复目录恢复前一个对应物
为了通过前一个对应物进行恢复,需要一个包含前一个对应物信息的控制文件。在大多数情况下,这可能是当前的控制文件。如果当前的控制文件不了解需要恢复的对应物,则需要还原包含该信息的控制文件,从而使得利用该方法恢复数据。可以使用list incarnation of database 命令查看控制文件了解哪些对应物.
没有连接恢复目录的list incarnation 输出与已连接恢复目录时的list incarnation 输出有一些细微的区别。这是因为信息从控制文件中获得的,因此某些键(如Inc key)将会不同。
操作步骤如下:
(1)从RMAN中运行list incarnation 命令,确定希望复位到哪个对应物
(2)关闭数据库
(3)启动加载数据库
(4)执行reset database to incarnation 命令复位对应物
(5)使用restore 命令还原数据库
(6)recover恢复数据库
(7)使用resetlogs 打开数据库
示例如下:
RMAN> list incarnation of database;
RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> reset database to incarnation 2; --将数据库重置为原型 2
RMAN> restore database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";
RMAN> recover database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";
RMAN> alter database open resetlogs;
RMAN> list incarnation;
注: until 后面可以跟三种类型:
1. restore database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";
2. recover database until scn 1000
3. recover database until sequence 150;
查看sequence:
SQL> select sequence# from v$archived_log;
SEQUENCE#
161
162
1
2
3
4
从这个结果也证明resetlogs 会重置sequnce,但是scn不会被重置。
查看scn:
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
8555698
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
8555706
1.3.4 表空间时间点恢复
使用表空间时间点恢复(TSPITR)可以将一个或多个非SYSTEM表空间恢复到与数据库其他部分不同的某个时间点上。这点和Flashback 有点类型。 比如用户误删了3张表,我们就可以用TSPITR恢复。
先看TSPITR 的工作流程,如下图所示:
(1) 在辅助实例上用target的备份集restore 数据文件
(2) 在辅助库上用target的归档文件recover 数据文件
(3) 在辅助库上导出相关数据
(4) 修改主库的控制文件
(5) 用辅助库上导出文件导入辅助库上。
几个相关相关的定义:
辅助实例(Auxiliary instance):我们创建的临时实例,RMAN可以使用这个实例执行TSPITR,完成TSPITR操作后,可以删除辅助实例。
辅助数据库(Auxiliary database):主数据库的一个复本或子集,用于表空间的临时恢复。
主数据库(Primary database):需要TSPITR的数据库。
恢复集(Recovery set):构成恢复到某一个时间点表空间的表空间或数据文件,SYSTEM表空间数据文件不能作为恢复集的一部分。
辅助集(Auxiliary set):需要执行TSPITR的其他目标数据库文件集。 辅助集包括备份控制文件,回滚和撤销段表空间数据文件,system表空间数据文件,辅助数据库的联机重做日志,以及一个可选的位于辅助数据库中的临时的表空间。
目标实例(target instance):包含将要恢复的表空间
1.3.4.1 为TSPITR 做准备
在开始执行TSPITR之前需要完成一些步骤。
(1) 确定还原的时间点
这是最关键的因素。 我们需要认真对待这项操作,因为如果没有使用恢复目录,则表空间的恢复是一次性的过程。 如果错误地标识了恢复的时间点,则不能重新来过。 如果使用恢复目录,则不存在这种限制。
(2) 确定传送集中的对象是自包含的
应该使用TS_PITR_CHECK 视图来确保恢复集是完整的,并且标识所有可能要用到的其他表空间。 首先需要检查TS_PITR_CHECK 视图来确保没有其他相关的表空间。 比如我们检查DAVE 表空间,示例代码如下:
/* Formatted on 2010/7/7 17:10:00 (QP5 v5.115.810.9015) */
SELECT obj1_owner,
obj1_name,
obj1_type,
reason
FROM sys.ts_pitr_check
WHERE (ts1_name IN ('BL') AND ts2_name NOT IN ('BL'))
OR (ts1_name NOT IN ('BL') AND Ts2_Name IN ('BL'))
如果没有冲突,则不会返回任何行。 如果存在冲突,则会看到描述的每个冲突的行。如果有冲突,我们也需要还原关联的表空间。
(3) 保存可能丢失的对象或数据
如果我们将Dave表空间恢复之前的某个时间,那么在这个时间以后的任何更改,如新建对象,更新,插入或者删除,都会丢失。 丢失这些对象可能没有问题,但假设我们需要保存这些数据,则需要导出将要保存的数据,或者将数据复制到数据库中的其他位置。 Oracle 提供了视图 TS_PITR_OBJECTS_TO_BEDROPPED, 该视图列出了将在恢复操作期间丢失的所有对象。 使用该视图可以确定表空间中的对象在恢复之后的状态。
SQL> col owner format a10
SQL> col name format a10
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> SELECT * FROM ts_pitr_objects_to_be_dropped WHERE tablespace_name = 'BL' ;
OWNER NAME CREATION_TIME TABLESPACE_NAME
---------- ---------- ------------------- ------------------------------
BL BL 2010-07-07 19:24:18 BL
1.3.4.2 执行实际的TSPITR
Oracle Database 10g将为我们执行自动的TSPITR,这意味着它将创建辅助实例。 在这种情况下,我们只需要连接目标数据库和可选的恢复目录(如果有的话),并且执行recover tablespace 命令。 RMAN 将为我们完成剩余的工作。
下 面演示使用recover tablespace 命令恢复BL 表空间的示例。 我们使用可选的auxiliary destination来指示 RMAN 和 Oracle 应该在何处创建与辅助数据库关联的文件。 使用该参数使得该恢复成为一个具有自动化实例的自定义TSPITR。 如果没有使 用该参数,TSPITR 就称为完全自动的TSPITR 恢复。
需 要注意的是,如果使用auxiliary destination参数,则应该已经创建了目标目录,并且Oracle 必须能够写入到该目标目录。 在目 标路径名中没有后缀的斜杠(/或/),如果包含斜杠将会导致TSPITR失败,并且获得错误消息无法确切地描述该问题。命令如下:
Recover tablespace BL until time "to_date('2010-7-7 20:38:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl'
在执行这个命令之前有几点注意的地方,因为TSPITR 会用已经存在的备份集和归档文件来创建辅助数据库,所以在执行该命令之前需要确认target 数据库有备份和归档,并且控制文件也要有备份。
RMAN> Recover tablespace BL until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl';
启动 recover 于 07-7月 -10
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=145 设备类型=DISK
RMAN-05026: 警告: 假定以下表空间集适用于指定的时间点
表空间列表要求具有 UNDO 段
表空间 SYSTEM
表空间 UNDOTBS1
使用 SID='iEfs' 创建自动实例 -- 这里是系统自动创建的辅助数据库名
供自动实例使用的初始化参数:
db_name=BL
db_unique_name=iEfs_tspitr_BL
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=280M
processes=50
db_create_file_dest=F:/bl
log_archive_dest_1='location=F:/bl'
#No auxiliary parameter file used
启动自动实例 BL
Oracle 实例已启动
系统全局区域总计 292933632 字节
Fixed Size 1374164 字节
Variable Size 100665388 字节
Database Buffers 184549376 字节
Redo Buffers 6344704 字节
自动实例已创建
对恢复集表空间运行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
内存脚本的内容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
sql 'alter system archive log current';
# avoid unnecessary autobackups for structural changes during TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';
}
正在执行内存脚本
正在执行命令: SET until clause
启动 restore 于 07-7月 -10
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=59 设备类型=DISK
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在还原控制文件
通道 ORA_AUX_DISK_1: 正在读取备份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B
L/AUTOBACKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP
通道 ORA_AUX_DISK_1: 段句柄 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA
CKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP 标记 = TAG20100707T201134
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:02
输出文件名=F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL
完成 restore 于 07-7月 -10
sql 语句: alter database mount clone database
sql 语句: alter system archive log current
sql 语句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;
内存脚本的内容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 2 to new;
set newname for clone tempfile 1 to new;
set newname for datafile 5 to
"D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 3, 2, 5;
switch clone datafile all;
}
正在执行内存脚本
正在执行命令: SET until clause
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 F:/BL/BL/DATAFILE/O1_MF_TEMP_%U_.TMP
启动 restore 于 07-7月 -10
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00005 还原到 D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF
通道 ORA_AUX_DISK_1: 正在读取备份片段 F:/BACKUP/BL_02LI7BSK_1_1.BAK
通道 ORA_AUX_DISK_1: 段句柄 = F:/BACKUP/BL_02LI7BSK_1_1.BAK 标记 = TAG20100707T200956
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:02:46
完成 restore 于 07-7月 -10
数据文件 1 已转换成数据文件副本
输入数据文件副本 RECID=4 STAMP=723761776 文件名=F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=5 STAMP=723761776 文件名=F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=6 STAMP=723761777 文件名=F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF
内存脚本的内容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 3 online";
sql clone "alter database datafile 2 online";
sql clone "alter database datafile 5 online";
# recover and open resetlogs
recover clone database tablespace "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
正在执行内存脚本
正在执行命令: SET until clause
sql 语句: alter database datafile 1 online
sql 语句: alter database datafile 3 online
sql 语句: alter database datafile 2 online
sql 语句: alter database datafile 5 online
启动 recover 于 07-7月 -10
使用通道 ORA_AUX_DISK_1
正在开始介质的恢复
线程 1 序列 7 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 存在于磁盘上
线程 1 序列 8 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 存在于磁盘上
线程 1 序列 9 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 存在于磁盘上
归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 线程=1 序列=7
归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 线程=1 序列=8
归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 线程=1 序列=9
介质恢复完成, 用时: 00:00:14
完成 recover 于 07-7月 -10
数据库已打开
内存脚本的内容:
{
# online the tablespaces that will be exported
sql clone 'alter tablespace BL online';
# make read only the tablespace that will be exported
sql clone 'alter tablespace BL read only';
# create directory for datapump import
sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''
F:/bl''";
# create directory for datapump export
sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''
F:/bl''";
}
正在执行内存脚本
sql 语句: alter tablespace BL online
sql 语句: alter tablespace BL read only
sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''
sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''
正在执行元数据导出...
EXPDP> 启动 "SYS"."TSPITR_EXP_iEfs":
EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE
EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
EXPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_EXP_iEfs"
EXPDP> ******************************************************************************
EXPDP> SYS.TSPITR_EXP_iEfs 的转储文件集为:
EXPDP> F:/BL/TSPITR_IEFS_51961.DMP
EXPDP> ******************************************************************************
EXPDP> 可传输表空间 BL 所需的数据文件:
EXPDP> D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF
EXPDP> 作业 "SYS"."TSPITR_EXP_iEfs" 已于 20:59:10 成功完成
导出完毕
内存脚本的内容:
{
# shutdown clone before import
shutdown clone immediate
# drop target tablespaces before importing them back
sql 'drop tablespace BL including contents keep datafiles';
}
正在执行内存脚本
数据库已关闭
数据库已卸装
Oracle 实例已关闭
sql 语句: drop tablespace BL including contents keep datafiles
正在执行元数据导入...
IMPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_IMP_iEfs"
IMPDP> 启动 "SYS"."TSPITR_IMP_iEfs":
IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE
IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
IMPDP> 作业 "SYS"."TSPITR_IMP_iEfs" 已于 21:00:49 成功完成
导入完毕
内存脚本的内容:
{
# make read write and offline the imported tablespaces
sql 'alter tablespace BL read write';
sql 'alter tablespace BL offline';
# enable autobackups after TSPITR is finished
sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';
}
正在执行内存脚本
sql 语句: alter tablespace BL read write
sql 语句: alter tablespace BL offline
sql 语句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;
删除自动实例
自动实例已删除
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_TEMP_638YDTJF_.TMP
已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_3_638YDJ2V_.LOG
已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_2_638YDDND_.LOG
已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_1_638YD9K7_.LOG
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF
已删除辅助实例文件 F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL
完成 recover 于 07-7月 -10
RMAN>
一旦完成了TSPITR,我们就应该能够查看到已经恢复的表空间中的对象,并且发现他们已经被恢复到请求的时间点。 我们需要将恢复的表空间改回到联机状态以使用它们。
SQL> select tablespace_name,online_status from dba_data_files;
TABLESPACE_NAME ONLINE_
------------------------------ -------
USERS ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
SYSTEM SYSTEM
BL OFFLINE
SQL> Alter tablespace BL online;
表空间已更改。
如果产生错误,Oracle 就会保持辅助实例和相关数据文件的完整性。 我们可以尝试修正问题并重新启动恢复操作。 在这种情况下,使用auxiliary参数重新启动RMAN,并且连接辅助实例。
如果辅助实例的创建工作没有完全成功,可以很容易的删除辅助实例和它的服务,而不是使用手工的TSPITR过程重新启动恢复操作。首先,指出失败的原因,然后删除实例和服务,并且重新启动自动的TSPITR过程。
删除辅助实例,用sysdba连接sqlplus,然后执行一下命令即可:
SQL> conn / as sysdba
已连接。
SQL> exec dbms_backup_restore.manageauxinstance('sjus',1);
PL/SQL 过程已成功完成。
这里的sjus 是辅助实例名,在RMAN的输出中有显示。这使TSPITR恢复之前清除所有旧的辅助实例,可以在执行该命令后进入辅助目标目录,并删除该目录中的任何文件。
1.3.4.3 带有自动化实例的自定义自动TSPITR
在执行TSPITR时可以使用自定义自动化实例创建,并且仍然允许Oracle 创建实例的其他的方法:
(1) 使用set newname 命令指示恢复集的单个数据文件的位置
(2) 使用configure auxname命令定义辅助实例名
(3) 为辅助实例创建自己的控制文件,并且在参数文件中提供参数(如:db_file_name_convert)。通过在$ORACLE_HOME/rdbms/admin 中创建名为parms_auxint.ora 文件来完成这项工作。 作为选择,我们可以使用RMAN命令set auxiliary instance parameter file 来指定辅助实例参数文件驻留在客户端上的路劲。
一旦已经自定义了辅助实例,就可以通过执行recover tablespace 命令让RMAN 创建辅助实例。
1.3.4.4 手工执行TSPITR
Oracle 支持为TSPITR 创建自己的辅助实例。 也可以使用手工的TSPITR来完成失败的自动TSPITR操作。 首先,依然是应用前面的准备阶段中列出的步骤,接着必须准备辅助实例,然后执行TSPITR过程。
准备辅助实例
首先,需要启动和运行辅助实例。辅助实例只是RMAN用于执行TSPITR的临时实例。 辅助实例必须驻留在与目标数据库相同的机器中,并且在辅助实例上不能执行任何类型的DML。
在启动TSPITR前,需要准备辅助实例。和普通的数据库实例创建一样。
Windows Oracle 10G手工创建数据库
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4680230.aspx
linux 下手工新建数据库
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4680213.aspx
我们假设创建的辅助实例名是TEST. 操作步骤如下:
(1) 创建口令文件
C:>orapwd file=D:/app/Administrator/product/11.2.0/dbhome_1/database/PWDTEST.ora password=admin
(2) 创建服务
C:/>oradim -new -sid TEST
oradim是创建实例的工具程序名称,-new表明执行新建实例,-delete表明执行删掉实例,-sid指定害例的名称。
(3) 创建参数文件
辅助数据库的参数文件不同于目标数据库所使用的参数文件。辅助实例中应该添加的一些参数如下表:
参数名 |
可选或必选 |
说明 |
Db_name |
可选 |
与目标数据库相同的名称 |
Lock_name_space |
必选 |
不同于创建辅助实例所在系统上其他数据库名的唯一名称。 |
Db_file_name_convert |
可选 |
用RMAN还原辅助数据库中的数据文件时,该参数用于为这些数据文件定义一组文件命名转换模式。 它可以代替RMAN的configure auxname命令。 |
Log_file_name_convert |
可选 |
用RMAN还原辅助数据库中的重做日志时,该参数用于为这些重做日志定义一组命令转换模式。 它可以代替RMAN的set newnameml . |
Control_files |
必要 |
这个参数定义了辅助实例控制文件的名称和位置。 辅助实例控制文件的名称应当不同于锁一定位置中已有的其他控制文件名。 |
Remote_login_passwordfile
|
可选/必要 |
用于允许RMAN 通过Oracle networking 服务连接辅助数据库。 要求存在一个当前的口令文件。 如果要本地连接辅助数据库,就不需要设置该参数。 |
Compatible |
必要 |
必须与目标数据库的设置相同 |
Db_block_size |
可选/必要 |
如果在目标数据库上设置了该参数,在辅助数据库中也必须设置为同样的参数值。 |
我们将所有辅助实例都放到F:/TEST目录下,辅助实例的参数如下:
db_name=BL
db_unique_name=TEST
db_block_size=8192
db_cache_size=8388608
timed_statistics=TRUE
shared_pool_size=110M
large_pool_size=1M
compatible=11.2.0.0.0
Background_dump_dest=F:/TEST
Core_dump_dest=F:/TEST
User_dump_dest=F:/TEST
Control_files=F:/TEST/control01.ctl
db_create_file_dest=F:/TEST
log_file_name_convert=('D:/app/Administrator/oradata/bl','F:/TEST');
将该参数保存为initTEST.ora, 存放在F:/TEST/下。
(4) 启动辅助实例,并检查网络连通性
C:/Users/Administrator.DavidDai>set ORACLE_SID=TEST
C:/Users/Administrator.DavidDai>sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 星期四 7月 8 15:52:17 2010
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup nomount pfile='f:/test/inittest.ora';
ORA-32006: BACKGROUND_DUMP_DEST initialization parameter has been deprecated
ORA-32006: USER_DUMP_DEST initialization parameter has been deprecated
ORACLE 例程已经启动。
Total System Global Area 163221504 bytes
Fixed Size 1373236 bytes
Variable Size 146803660 bytes
Database Buffers 8388608 bytes
Redo Buffers 6656000 bytes
SQL>
(5) 执行带有手工辅助实例的TSPITR
用RMAN 连接目标数据库,辅助实例,和恢复目录(如果有)。
还原控制文件,打开辅助实例。
C:/Users/Administrator.DavidDai>set ORACLE_SID=TEST
C:/Users/Administrator.DavidDai>rman target sys/admin@bl auxiliary=/
恢复管理器: Release 11.2.0.1.0 - Production on 星期四 7月 8 16:05:56 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到目标数据库: BL (DBID=680066685)
已连接到辅助数据库: BL (未装载)
RMAN> run
2> {
3> set until time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";
4> restore clone controlfile ;
5> sql clone 'alter database mount clone database';
6> sql 'alter system archive log current';
7> }
正在执行命令: SET until clause
启动 restore 于 08-7月 -10
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在还原控制文件
通道 ORA_AUX_DISK_1: 正在读取备份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B
L/AUTOBACKUP/2010_07_08/O1_MF_S_723831710_63C2O0HN_.BKP
通道 ORA_AUX_DISK_1: 段句柄 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA
CKUP/2010_07_08/O1_MF_S_723831710_63C2O0HN_.BKP 标记 = TAG20100708T162150
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:02
输出文件名=F:/TEST/CONTROL01.CTL
完成 restore 于 08-7月 -10
sql 语句: alter database mount clone database
sql 语句: alter system archive log current
RMAN>
说明:1. alter system archive log current,它确保用于副本数据库恢复的所有重做都可用。
2. Sql colne 命令是在副本数据库上执行sql命令
确定并还原数据文件
我们需要还原system,sysaux, undo, temp 表空间,和我们将要还原的表空间,这里是BL 表空间。要注意的是,在我们开始创建辅助实例之前,要将待恢复的表空间设置为offline.
SQL> select file_id,tablespace_name from dba_data_files;
FILE_ID TABLESPACE_NAME
---------- ------------------------------
4 USERS
3 UNDOTBS1
2 SYSAUX
1 SYSTEM
5 BL
SQL> alter tablespace BL offline for recover;
表空间已更改。
RMAN> run
2> {
3> # set requested point in time
4> set until time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";
5> # set destinations for recovery set and auxiliary set datafiles
6> set newname for clone datafile 1 to new;
7> set newname for clone datafile 3 to new;
8> set newname for clone datafile 2 to new;
9> set newname for clone tempfile 1 to new;
10> set newname for datafile 5 to "D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";
11> # switch all tempfiles
12> switch clone tempfile all;
13> # restore the tablespaces in the recovery set and the auxiliary set
14> restore clone datafile 1, 3, 2, 5;
15> switch clone datafile all;
16> }
说明: set newname for clone 命令确保还原期间正确的命令这些文件。 对数据文件5进行set newname是为还原该数据文件做准备。
打开辅助实例,准备执行TSPITR:
run
{
# set requested point in time
set until time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 3 online";
sql clone "alter database datafile 2 online";
sql clone "alter database datafile 5 online";
# recover and open resetlogs
recover clone database tablespace "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
导出元数据,在导入数据
Exp user/pwd point_in_time_recover=y tablespaces=BL file=tspitr.dmp
Imp user/pwd point_in_time_recover=y file=tspitr.dmp
最后将BL表空间online
Alter tablespace BL online.
操作完成后,别忘了重新备份数据库,及删除辅助实例。
从上面的步骤来看,手工操作和自动步骤是一样的,只不过手工将这些步骤分开了。
1.3.4.5 TSPITR的限制
TSPITR 有许多的限制:
(1)不能还原包含SYS用户特有对象的表空间
(2)不能用TSPITR恢复含有复制主表的表空间
(3)不支持使用快照日志的表空间
(4)不能还原含有回滚段的表空间
(5)如果要恢复的表空间中的对象包含如下对象,则不支持:
Varray
嵌套表
外部文件
此外,TSPITR 不能用于恢复删除的表空间,我们也不能恢复旧的对象统计表。
如果使用不含恢复目录的RMAN,还会存在下面与TSPITR的限制:
(1)在要恢复的点和当前的点之间,目标数据库中撤销和回滚段的当前物理结构必须没有变化。 回滚段在恢复期间不能发生变化。
(2)完成指定表空间的TSPITR后,这个表空间以前的所有备份就不能在用于以后的TSPITR。 这就是TSPITR后的表空间备份操作非常重要的原因,只有再次备份表空间后才能执行下一个TSPITR.