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命令与untiltime,untilSCN或untilsequence参数
Run
{
Setuntiltime"to_date('-07-0514:02:00','yyyy-mm-ddhh24:mi:ss')";
Restoredatabase;
Recoverdatabasealterdatabaseopenresetlogs;
}
执行这条命令时,RMAN会查找与恢复目标时间最近(并非恢复目标时间本身也不能是位于恢复目标之间的时间)的备份集,并且从这个备份集中还原数据库。如果数据库置于noarchivelog模式中,恢复操作会在备份集的时间停止;否则在执行recover命令期间,oracle会在所定义的恢复目标(不包含恢复目标本身)上应用归档的重做日志(以及需要应用的任何增量备份)。
注意:如果尝试恢复到特定备份的完成点,则必须恢复到备份集中文件的CKPSCN或CKPTIME,在不同备份集的RMANlist命令中会列出这些内容。有时使用备份的CKPTIME并不够,还可能导致ORA-1152错误。
1.3.1.2 在restore和recover命令中直接使用untiltime,untilSCN和untilsequence参数
这种方法避免使用run代码块,也倾向与使用这种方法。
Startupmount;
Restoredatabaseuntiltime"to_date('-07-0514:02:00','yyyy-mm-ddhh24:mi:ss')";
Recoverdatabaseuntiltime"to_date('-07-0514:02:00','yyyy-mm-ddhh24:mi:ss')";
Alterdatabaseopenresetlogs;
1.3.2 基于时间的恢复
这种恢复类型允许用户将数据库恢复到与指定时间一致的状态。当然,如果不存在能将数据库还原到用户请求的时间的有效备份或归档重做日志,Oracle就会报RMAN-03002和RMAN-7的错误。
必须具备在我们指定的恢复时间之前生成的数据库备份,此外还需要所有归档的重做日志。
1.3.3 基于SCN的恢复
Oracle允许用户将数据库恢复到指定的SCN,实际上,这并不是一种常见的恢复方法。示例如下:
Startupmount;
RestoredatabaseuntilSCN1000;
RecoverdatabaseuntilSCN1000;
Alterdatabaseopenresetlogs;
注意:该示例可以将数据库还原到SCN1000,但是不会包含SCN.
1.3.4 基于日志序列的恢复
RMAN允许用户将数据库恢复到指定序列号的归档重做日志。如果归档的重做日志中存在间隙,使用这种恢复方法就非常方便。间隙通常意味着我们只能将数据库还原到间隙的开始点。
Startupmount;
Restoredatabaseuntilsequence100thread1;
Recoverdatabaseuntilsequence100thread1;
Alterdatabaseopenresetlogs;
1.3.5 只读表空间的恢复
在默认情况下,即使丢失了只读的数据文件,RMAN也不会在执行完全恢复数据库还原操作时还原只读的数据文件。要在完全恢复期间还原只读的数据文件,就必须在restore命令中使用checkreadonly参数,如:
Restoredatabasecheckreadonly;
注意,执行recovertablespace或recoverdatafile命令时,RMAN的工作情况是不一样的。使用这两个命令时,不管表空间是否为只读状态都会执行恢复操作。
1.3.6 归档重做日志的还原
在使用RMAN的普通恢复过程中,不必恢复归档的重做日志。不过,偶尔也会要求还原一个或多个归档的重做日志。例如,我们可能需要使用LogMiner在备份中存储的归档重做日志文件里查找一些信息。
Restorearchivelogall;
Restorearchivelogfromlogseq=20thread=1;
Restorearchivelogfromlogseq=20untillogseq=30thread=1;
还可以将归档的重做日志还原到默认位置以外的位置上:
Run
{
Setarchivelogdestinationto"d:/arch";
Restorearchivelogall;
}
注意:1.上例中的set命令没有替代方法,必须要求使用set。
2.如果RMAN认为一个归档的重做日志已存在,就不会在磁盘上还原这个归档的重做日志,即使设置的还原位置不同与默认的归档日志位置,Oracle也不会在这个新的位置上恢复归档的重做日志。
1.3.7 数据文件副本的还原
可以从数据文件副本(不是备份集)中还原数据库的数据文件。要实现这个功能,需要先使用restorefromdatafilecopy命令,然后再使用恢复数据库(或表空间,数据文件)的recover。
RMAN>Restore(datafile5)fromdatafilecopy;--此处的圆括号是必须的,如果没有就报错
RMAN>Recoverdatafile5;
SQL>Alterdatabasedatafile5online;
执行restore时,该命令会识别需要还原的数据文件的最新副本,然后从这个副本中还原这些数据文件。数据文件的最新副本可能是在一个数据文件副本中,而不是在一个副本中。在这种情况下,Oracle会恢复这个数据文件副本。
1.3.1 使用resetlogslogs命令
在不完全恢复期间,通常需要使用resetlogs命令打开数据库,这是因为我们要从已经简历的现有日志流中脱离出来,并且需要向Oracle说明这种情况.Resetlogs命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始.数据库的逻辑生存期也称为一个对应物(Incarnation).每次使用resetlogs命令都会创建一个新的数据库对应物,这对于恢复操作来说非常重要.
每次使用resetlogs命令时,SCN计数器不会被重置,不过Oracle会重置其他计数器(如:日志序列号),同时还会重置联机重做日志的内容.
Oracle10g简化了通过resetlogs命令进行的恢复,在归档的重做日志名中添加了一个新的特换串(%r),该字符串表示resetlogID号。在log_archive_dest_format参数串中包括%r时,归档的重做日志名在每个resetlogs命令中保持唯一。这种改动以及其他的内部Oracle数据库改动使oracle可以很容易的通过给定的resetlogs操作恢复数据库。因此,可以很容易的在执行操作后立刻备份数据库,然而,我们仍然认为在任何不完全恢复后备份数据库是很有必要的。
1.3.2 恢复讹误的数据块
即使与讹误数据块关联的数据文件一直联机,也可以通过用块介质恢复(blockMediarecover:BMR)执行块级别恢复操作来修复Oracle数据库中的这些逻辑上或者物理上的讹误数据块。
一般出现数据块错误时,都会有错误消息:
ORA-01578:ORACLEdatablockcorrupted(file#18,block#88)
如果没有BMR时,我们必须从一个备份中恢复这个数据文件,在恢复过程中,用户不能使用该数据块文件中的所有数据。
用BMR恢复就很简单,只需要执行blockrecover命令即可:
Blockrecoverdatafile18block88;
如果有必要,可以同时恢复多个数据文件的多个数据块。如:
Blockrecoverdatafile18block16,17,88,108;
Blcokrecoverdatafile18block88datafile19blcok188;
Oracle会跟踪在备份和恢复期间发生的数据块讹误。如果检测到备份或复制操作出现讹误,由于Oracle不允许在备份中出现讹误,所有这个备份就会失败。当然,可以配置RMAN允许一定数量的讹误,但是不推荐这种用法。
可以使用backupvalidatedatabase命令查看RMAN检测到的所有数据库讹误。这条命令会在v$backup_corruption和v$database_block_corruption视图中填充检测到的所有讹误数据块。如果讹误发生在复制操作期间,v$copy_corruption视图就会指明包含讹误的备份集。
注意的是:v$backup_corruption是一个显示历史讹误的视图,v$database_block_corruption则是一个显示当前数据块讹误的视图。一旦修正了数据库的块讹误,就需要重新运行backupvalidatedatabase命令,然后查询v$database_block_corruption视图以确保不存在其他讹误。
查询v$database_block_corruption视图可以查看讹误数据块的详细信息。如下所示,使用具有corruptionlistrestore参数的blockrecover命令可以方便地修正v$database_block_corruption视图中的讹误数据块。
Blockrecovercorruptionlistrestoreuntiltime'SYSDATE-5';
这条命令将还原讹误列表中最近5天的所有讹误数据块。在上面的命令中,还可以使用untiltime和untilsequence.
1.3.3 恢复前一个对应物
一个数据库的对应物(incarnation)对应这个数据库的特定逻辑生存期。有时我们需要使用上次执行resetlogs命令打开数据库前生成的一个备份来还原数据库,或者可能需要还原到执行上一个resetlogs命令之前的时间点。这就需要用到incarnation.
1.3.3.1 使用恢复目录恢复前一个对应物
先假设使用恢复目录执行了备份操作,并且最近使用了resetlogs命令执行过时间点恢复,现在需要使用执行resetlogs命令之前的一个备份来恢复数据库。
操作步骤:
(1)启动但不加载实例,这是因为我们要先得到一个与恢复数据库对应物关联的控制文件
(2)使用resetdatabasetoincarnation命令为RMAN指示对应物的备份集。
(3)Restorecontrolfile,使rman还原最新的控制文件
(4)加载数据库
(5)Restore数据库
(6)Recover数据库
(7)使用resetlogs打开数据库
示例如下:
C:/Users/Administrator.DavidDai>rmantarget/catalogrman/rman@orcl;
RMAN>listincarnation;
RMAN>startupforcenomount;
RMAN>resetdatabasetoincarnation4;
RMAN>restorecontrolfile;
RMAN> alterdatabasemount;
RMAN> restoredatabaseuntilscn940990;
RMAN> recoverdatabaseuntilscn940990;
RMAN> alterdatabaseopenresetlogs;
1.3.3.2 不使用恢复目录恢复前一个对应物
为了通过前一个对应物进行恢复,需要一个包含前一个对应物信息的控制文件。在大多数情况下,这可能是当前的控制文件。如果当前的控制文件不了解需要恢复的对应物,则需要还原包含该信息的控制文件,从而使得利用该方法恢复数据。可以使用listincarnationofdatabase命令查看控制文件了解哪些对应物.
没有连接恢复目录的listincarnation输出与已连接恢复目录时的listincarnation输出有一些细微的区别。这是因为信息从控制文件中获得的,因此某些键(如Inckey)将会不同。
操作步骤如下:
(1)从RMAN中运行listincarnation命令,确定希望复位到哪个对应物
(2)关闭数据库
(3)启动加载数据库
(4)执行resetdatabasetoincarnation命令复位对应物
(5)使用restore命令还原数据库
(6)recover恢复数据库
(7)使用resetlogs打开数据库
示例如下:
RMAN>listincarnationofdatabase;
RMAN> shutdownimmediate;
RMAN> startupmount;
RMAN>resetdatabasetoincarnation2; --将数据库重置为原型2
RMAN>restoredatabaseuntiltime"to_date('-7-523:50:39','yyyy-mm-ddhh24:mi:ss')";
RMAN>recoverdatabaseuntiltime"to_date('-7-523:50:39','yyyy-mm-ddhh24:mi:ss')";
RMAN>alterdatabaseopenresetlogs;
RMAN>listincarnation;
注:until后面可以跟三种类型:
1.restoredatabaseuntiltime"to_date('-7-523:50:39','yyyy-mm-ddhh24:mi:ss')";
2.recoverdatabaseuntilscn1000
3.recoverdatabaseuntilsequence150;
查看sequence:
SQL>selectsequence#fromv$archived_log;
SEQUENCE#
161
162
1
2
3
4
从这个结果也证明resetlogs会重置sequnce,但是scn不会被重置。
查看scn:
SQL>selectcurrent_scnfromv$database;
CURRENT_SCN
-----------
8555698
SQL>selectdbms_flashback.get_system_change_numberfromdual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
8555706
1.3.4 表空间时间点恢复
使用表空间时间点恢复(TSPITR)可以将一个或多个非SYSTEM表空间恢复到与数据库其他部分不同的某个时间点上。这点和Flashback有点类型。比如用户误删了3张表,我们就可以用TSPITR恢复。
先看TSPITR的工作流程,如下图所示:
(1)在辅助实例上用target的备份集restore数据文件
(2)在辅助库上用target的归档文件recover数据文件
(3)在辅助库上导出相关数据
(4)修改主库的控制文件
(5)用辅助库上导出文件导入辅助库上。
几个相关相关的定义:
辅助实例(Auxiliaryinstance):我们创建的临时实例,RMAN可以使用这个实例执行TSPITR,完成TSPITR操作后,可以删除辅助实例。
辅助数据库(Auxiliarydatabase):主数据库的一个复本或子集,用于表空间的临时恢复。
主数据库(Primarydatabase):需要TSPITR的数据库。
恢复集(Recoveryset):构成恢复到某一个时间点表空间的表空间或数据文件,SYSTEM表空间数据文件不能作为恢复集的一部分。
辅助集(Auxiliaryset):需要执行TSPITR的其他目标数据库文件集。辅助集包括备份控制文件,回滚和撤销段表空间数据文件,system表空间数据文件,辅助数据库的联机重做日志,以及一个可选的位于辅助数据库中的临时的表空间。
目标实例(targetinstance):包含将要恢复的表空间
1.3.4.1 为TSPITR做准备
在开始执行TSPITR之前需要完成一些步骤。
(1)确定还原的时间点
这是最关键的因素。我们需要认真对待这项操作,因为如果没有使用恢复目录,则表空间的恢复是一次性的过程。如果错误地标识了恢复的时间点,则不能重新来过。如果使用恢复目录,则不存在这种限制。
(2)确定传送集中的对象是自包含的
应该使用TS_PITR_CHECK视图来确保恢复集是完整的,并且标识所有可能要用到的其他表空间。首先需要检查TS_PITR_CHECK视图来确保没有其他相关的表空间。比如我们检查DAVE表空间,示例代码如下:
/*Formattedon/7/717:10:00(QP5v5.115.810.9015)*/
SELECTobj1_owner,
obj1_name,
obj1_type,
reason
FROMsys.ts_pitr_check
WHERE(ts1_nameIN('BL')ANDts2_nameNOTIN('BL'))
OR(ts1_nameNOTIN('BL')ANDTs2_NameIN('BL'))
如果没有冲突,则不会返回任何行。如果存在冲突,则会看到描述的每个冲突的行。如果有冲突,我们也需要还原关联的表空间。
(3)保存可能丢失的对象或数据
如果我们将Dave表空间恢复之前的某个时间,那么在这个时间以后的任何更改,如新建对象,更新,插入或者删除,都会丢失。丢失这些对象可能没有问题,但假设我们需要保存这些数据,则需要导出将要保存的数据,或者将数据复制到数据库中的其他位置。Oracle提供了视图TS_PITR_OBJECTS_TO_BEDROPPED,该视图列出了将在恢复操作期间丢失的所有对象。使用该视图可以确定表空间中的对象在恢复之后的状态。
SQL>colownerformata10
SQL>colnameformata10
SQL>altersessionsetnls_date_format='yyyy-mm-ddhh24:mi:ss';
SQL>SELECT*FROMts_pitr_objects_to_be_droppedWHEREtablespace_name='BL';
OWNERNAMECREATION_TIMETABLESPACE_NAME
---------------------------------------------------------------------
BLBL-07-0719:24:18BL
1.3.4.2 执行实际的TSPITR
OracleDatabase10g将为我们执行自动的TSPITR,这意味着它将创建辅助实例。在这种情况下,我们只需要连接目标数据库和可选的恢复目录(如果有的话),并且执行recovertablespace命令。RMAN将为我们完成剩余的工作。
下 面演示使用recovertablespace命令恢复BL表空间的示例。我们使用可选的auxiliarydestination来指示 RMAN和Oracle应该在何处创建与辅助数据库关联的文件。使用该参数使得该恢复成为一个具有自动化实例的自定义TSPITR。如果没有使 用该参数,TSPITR就称为完全自动的TSPITR 恢复。
需 要注意的是,如果使用auxiliarydestination参数,则应该已经创建了目标目录,并且Oracle必须能够写入到该目标目录。在目 标路径名中没有后缀的斜杠(/或/),如果包含斜杠将会导致TSPITR失败,并且获得错误消息无法确切地描述该问题。命令如下:
RecovertablespaceBLuntiltime"to_date('-7-720:38:18','yyyy-mm-ddhh24:mi:ss')"auxiliarydestination'F:/bl'
在执行这个命令之前有几点注意的地方,因为TSPITR会用已经存在的备份集和归档文件来创建辅助数据库,所以在执行该命令之前需要确认target数据库有备份和归档,并且控制文件也要有备份。
RMAN>RecovertablespaceBLuntiltime"to_date('-7-720:40:18','yyyy-mm-ddhh24:mi:ss')"auxiliarydestination'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'
#Noauxiliaryparameterfileused
启动自动实例BL
Oracle实例已启动
系统全局区域总计292933632字节
FixedSize1374164字节
VariableSize100665388字节
DatabaseBuffers184549376字节
RedoBuffers6344704字节
自动实例已创建
对恢复集表空间运行TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK已成功完成
内存脚本的内容:
{
#setrequestedpointintime
setuntiltime"to_date('-7-720:40:18','yyyy-mm-ddhh24:mi:ss')";
#restorethecontrolfile
restoreclonecontrolfile;
#mountthecontrolfile
sqlclone'alterdatabasemountclonedatabase';
#archivecurrentonlinelog
sql'altersystemarchivelogcurrent';
#avoidunnecessaryautobackupsforstructuralchangesduringTSPITR
sql'begindbms_backup_restore.AutoBackupFlag(FALSE);end;';
}
正在执行内存脚本
正在执行命令:SETuntilclause
启动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/_07_07/O1_MF_S_723759094_638VQR8R_.BKP
通道ORA_AUX_DISK_1:段句柄=D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA
CKUP/_07_07/O1_MF_S_723759094_638VQR8R_.BKP标记=TAG0707T34
通道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语句:alterdatabasemountclonedatabase
sql语句:altersystemarchivelogcurrent
sql语句:begindbms_backup_restore.AutoBackupFlag(FALSE);end;
内存脚本的内容:
{
#setrequestedpointintime
setuntiltime"to_date('-7-720:40:18','yyyy-mm-ddhh24:mi:ss')";
#setdestinationsforrecoverysetandauxiliarysetdatafiles
setnewnameforclonedatafile1tonew;
setnewnameforclonedatafile3tonew;
setnewnameforclonedatafile2tonew;
setnewnameforclonetempfile1tonew;
setnewnamefordatafile5to
"D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";
#switchalltempfiles
switchclonetempfileall;
#restorethetablespacesintherecoverysetandtheauxiliaryset
restoreclonedatafile1,3,2,5;
switchclonedatafileall;
}
正在执行内存脚本
正在执行命令:SETuntilclause
正在执行命令:SETNEWNAME
正在执行命令:SETNEWNAME
正在执行命令:SETNEWNAME
正在执行命令:SETNEWNAME
正在执行命令:SETNEWNAME
临时文件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标记=TAG0707T56
通道ORA_AUX_DISK_1:已还原备份片段1
通道ORA_AUX_DISK_1:还原完成,用时:00:02:46
完成restore于07-7月-10
数据文件1已转换成数据文件副本
输入数据文件副本RECID=4STAMP=723761776文件名=F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF
数据文件3已转换成数据文件副本
输入数据文件副本RECID=5STAMP=723761776文件名=F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF
数据文件2已转换成数据文件副本
输入数据文件副本RECID=6STAMP=723761777文件名=F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF
内存脚本的内容:
{
#setrequestedpointintime
setuntiltime"to_date('-7-720:40:18','yyyy-mm-ddhh24:mi:ss')";
#onlinethedatafilesrestoredorswitched
sqlclone"alterdatabasedatafile1online";
sqlclone"alterdatabasedatafile3online";
sqlclone"alterdatabasedatafile2online";
sqlclone"alterdatabasedatafile5online";
#recoverandopenresetlogs
recoverclonedatabasetablespace"BL","SYSTEM","UNDOTBS1","SYSAUX"deletearchivelog;
alterclonedatabaseopenresetlogs;
}
正在执行内存脚本
正在执行命令:SETuntilclause
sql语句:alterdatabasedatafile1online
sql语句:alterdatabasedatafile3online
sql语句:alterdatabasedatafile2online
sql语句:alterdatabasedatafile5online
启动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
数据库已打开
内存脚本的内容:
{
#onlinethetablespacesthatwillbeexported
sqlclone'altertablespaceBLonline';
#makereadonlythetablespacethatwillbeexported
sqlclone'altertablespaceBLreadonly';
#createdirectoryfordatapumpimport
sql"createorreplacedirectoryTSPITR_DIROBJ_DPDIRas''
F:/bl''";
#createdirectoryfordatapumpexport
sqlclone"createorreplacedirectoryTSPITR_DIROBJ_DPDIRas''
F:/bl''";
}
正在执行内存脚本
sql语句:altertablespaceBLonline
sql语句:altertablespaceBLreadonly
sql语句:createorreplacedirectoryTSPITR_DIROBJ_DPDIRas''F:/bl''
sql语句:createorreplacedirectoryTSPITR_DIROBJ_DPDIRas''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成功完成
导出完毕
内存脚本的内容:
{
#shutdownclonebeforeimport
shutdowncloneimmediate
#droptargettablespacesbeforeimportingthemback
sql'droptablespaceBLincludingcontentskeepdatafiles';
}
正在执行内存脚本
数据库已关闭
数据库已卸装
Oracle实例已关闭
sql语句:droptablespaceBLincludingcontentskeepdatafiles
正在执行元数据导入...
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成功完成
导入完毕
内存脚本的内容:
{
#makereadwriteandofflinetheimportedtablespaces
sql'altertablespaceBLreadwrite';
sql'altertablespaceBLoffline';
#enableautobackupsafterTSPITRisfinished
sql'begindbms_backup_restore.AutoBackupFlag(TRUE);end;';
}
正在执行内存脚本
sql语句:altertablespaceBLreadwrite
sql语句:altertablespaceBLoffline
sql语句:begindbms_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>selecttablespace_name,online_statusfromdba_data_files;
TABLESPACE_NAMEONLINE_
-------------------------------------
USERSONLINE
UNDOTBS1ONLINE
SYSAUXONLINE
SYSTEMSYSTEM
BLOFFLINE
SQL>AltertablespaceBLonline;
表空间已更改。
如果产生错误,Oracle就会保持辅助实例和相关数据文件的完整性。我们可以尝试修正问题并重新启动恢复操作。在这种情况下,使用auxiliary参数重新启动RMAN,并且连接辅助实例。
如果辅助实例的创建工作没有完全成功,可以很容易的删除辅助实例和它的服务,而不是使用手工的TSPITR过程重新启动恢复操作。首先,指出失败的原因,然后删除实例和服务,并且重新启动自动的TSPITR过程。
删除辅助实例,用sysdba连接sqlplus,然后执行一下命令即可:
SQL>conn/assysdba
已连接。
SQL>execdbms_backup_restore.manageauxinstance('sjus',1);
PL/SQL过程已成功完成。
这里的sjus是辅助实例名,在RMAN的输出中有显示。这使TSPITR恢复之前清除所有旧的辅助实例,可以在执行该命令后进入辅助目标目录,并删除该目录中的任何文件。
1.3.4.3 带有自动化实例的自定义自动TSPITR
在执行TSPITR时可以使用自定义自动化实例创建,并且仍然允许Oracle创建实例的其他的方法:
(1)使用setnewname命令指示恢复集的单个数据文件的位置
(2)使用configureauxname命令定义辅助实例名
(3)为辅助实例创建自己的控制文件,并且在参数文件中提供参数(如:db_file_name_convert)。通过在$ORACLE_HOME/rdbms/admin中创建名为parms_auxint.ora文件来完成这项工作。作为选择,我们可以使用RMAN命令setauxiliaryinstanceparameterfile来指定辅助实例参数文件驻留在客户端上的路劲。
一旦已经自定义了辅助实例,就可以通过执行recovertablespace命令让RMAN创建辅助实例。
1.3.4.4 手工执行TSPITR
Oracle支持为TSPITR创建自己的辅助实例。也可以使用手工的TSPITR来完成失败的自动TSPITR操作。首先,依然是应用前面的准备阶段中列出的步骤,接着必须准备辅助实例,然后执行TSPITR过程。
准备辅助实例
首先,需要启动和运行辅助实例。辅助实例只是RMAN用于执行TSPITR的临时实例。辅助实例必须驻留在与目标数据库相同的机器中,并且在辅助实例上不能执行任何类型的DML。
在启动TSPITR前,需要准备辅助实例。和普通的数据库实例创建一样。
WindowsOracle10G手工创建数据库
linux下手工新建数据库
我们假设创建的辅助实例名是TEST.操作步骤如下:
(1)创建口令文件
C:>orapwdfile=D:/app/Administrator/product/11.2.0/dbhome_1/database/PWDTEST.orapassword=admin
(2)创建服务
C:/>oradim-new-sidTEST
oradim是创建实例的工具程序名称,-new表明执行新建实例,-delete表明执行删掉实例,-sid指定害例的名称。
(3)创建参数文件
辅助数据库的参数文件不同于目标数据库所使用的参数文件。辅助实例中应该添加的一些参数如下表:
参数名
可选或必选
说明
Db_name
可选
与目标数据库相同的名称
Lock_name_space
必选
不同于创建辅助实例所在系统上其他数据库名的唯一名称。
Db_file_name_convert
可选
用RMAN还原辅助数据库中的数据文件时,该参数用于为这些数据文件定义一组文件命名转换模式。它可以代替RMAN的configureauxname命令。
Log_file_name_convert
可选
用RMAN还原辅助数据库中的重做日志时,该参数用于为这些重做日志定义一组命令转换模式。它可以代替RMAN的setnewnameml.
Control_files
必要
这个参数定义了辅助实例控制文件的名称和位置。辅助实例控制文件的名称应当不同于锁一定位置中已有的其他控制文件名。
Remote_login_passwordfile
可选/必要
用于允许RMAN通过Oraclenetworking服务连接辅助数据库。要求存在一个当前的口令文件。如果要本地连接辅助数据库,就不需要设置该参数。
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>setORACLE_SID=TEST
C:/Users/Administrator.DavidDai>sqlplus/nolog
SQL*Plus:Release11.2.0.1.0Productionon星期四7月815:52:17
Copyright(c)1982,,Oracle.Allrightsreserved.
SQL>conn/assysdba
已连接到空闲例程。
SQL>startupnomountpfile='f:/test/inittest.ora';
ORA-3:BACKGROUND_DUMP_DESTinitializationparameterhasbeendeprecated
ORA-3:USER_DUMP_DESTinitializationparameterhasbeendeprecated
ORACLE例程已经启动。
TotalSystemGlobalArea163221504bytes
FixedSize1373236bytes
VariableSize146803660bytes
DatabaseBuffers8388608bytes
RedoBuffers6656000bytes
SQL>
(5)执行带有手工辅助实例的TSPITR
用RMAN连接目标数据库,辅助实例,和恢复目录(如果有)。
还原控制文件,打开辅助实例。
C:/Users/Administrator.DavidDai>setORACLE_SID=TEST
C:/Users/Administrator.DavidDai>rmantargetsys/admin@blauxiliary=/
恢复管理器:Release11.2.0.1.0-Productionon星期四7月816:05:56
Copyright(c)1982,,Oracleand/oritsaffiliates.Allrightsreserved.
连接到目标数据库:BL(DBID=680066685)
已连接到辅助数据库:BL(未装载)
RMAN>run
2>{
3>setuntiltime"to_date('-7-816:23:18','yyyy-mm-ddhh24:mi:ss')";
4>restoreclonecontrolfile;
5>sqlclone'alterdatabasemountclonedatabase';
6>sql'altersystemarchivelogcurrent';
7>}
正在执行命令:SETuntilclause
启动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/_07_08/O1_MF_S_723831710_63C2O0HN_.BKP
通道ORA_AUX_DISK_1:段句柄=D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA
CKUP/_07_08/O1_MF_S_723831710_63C2O0HN_.BKP标记=TAG0708T162150
通道ORA_AUX_DISK_1:已还原备份片段1
通道ORA_AUX_DISK_1:还原完成,用时:00:00:02
输出文件名=F:/TEST/CONTROL01.CTL
完成restore于08-7月-10
sql语句:alterdatabasemountclonedatabase
sql语句:altersystemarchivelogcurrent
RMAN>
说明:1.altersystemarchivelogcurrent,它确保用于副本数据库恢复的所有重做都可用。
2.Sqlcolne命令是在副本数据库上执行sql命令
确定并还原数据文件
我们需要还原system,sysaux,undo,temp表空间,和我们将要还原的表空间,这里是BL表空间。要注意的是,在我们开始创建辅助实例之前,要将待恢复的表空间设置为offline.
SQL>selectfile_id,tablespace_namefromdba_data_files;
FILE_IDTABLESPACE_NAME
----------------------------------------
4USERS
3UNDOTBS1
2SYSAUX
1SYSTEM
5BL
SQL>altertablespaceBLofflineforrecover;
表空间已更改。
RMAN>run
2>{
3>#setrequestedpointintime
4>setuntiltime"to_date('-7-816:23:18','yyyy-mm-ddhh24:mi:ss')";
5>#setdestinationsforrecoverysetandauxiliarysetdatafiles
6>setnewnameforclonedatafile1tonew;
7>setnewnameforclonedatafile3tonew;
8>setnewnameforclonedatafile2tonew;
9>setnewnameforclonetempfile1tonew;
10>setnewnamefordatafile5to"D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";
11>#switchalltempfiles
12>switchclonetempfileall;
13>#restorethetablespacesintherecoverysetandtheauxiliaryset
14>restoreclonedatafile1,3,2,5;
15>switchclonedatafileall;
16>}
说明:setnewnameforclone命令确保还原期间正确的命令这些文件。对数据文件5进行setnewname是为还原该数据文件做准备。
打开辅助实例,准备执行TSPITR:
run
{
#setrequestedpointintime
setuntiltime"to_date('-7-816:23:18','yyyy-mm-ddhh24:mi:ss')";
#onlinethedatafilesrestoredorswitched
sqlclone"alterdatabasedatafile1online";
sqlclone"alterdatabasedatafile3online";
sqlclone"alterdatabasedatafile2online";
sqlclone"alterdatabasedatafile5online";
#recoverandopenresetlogs
recoverclonedatabasetablespace"BL","SYSTEM","UNDOTBS1","SYSAUX"deletearchivelog;
alterclonedatabaseopenresetlogs;
}
导出元数据,在导入数据
Expuser/pwdpoint_in_time_recover=ytablespaces=BLfile=tspitr.dmp
Impuser/pwdpoint_in_time_recover=yfile=tspitr.dmp
最后将BL表空间online
AltertablespaceBLonline.
操作完成后,别忘了重新备份数据库,及删除辅助实例。
从上面的步骤来看,手工操作和自动步骤是一样的,只不过手工将这些步骤分开了。
1.3.4.5 TSPITR的限制
TSPITR有许多的限制:
(1)不能还原包含SYS用户特有对象的表空间
(2)不能用TSPITR恢复含有复制主表的表空间
(3)不支持使用快照日志的表空间
(4)不能还原含有回滚段的表空间
(5)如果要恢复的表空间中的对象包含如下对象,则不支持:
Varray
嵌套表
外部文件
此外,TSPITR不能用于恢复删除的表空间,我们也不能恢复旧的对象统计表。
如果使用不含恢复目录的RMAN,还会存在下面与TSPITR的限制:
(1)在要恢复的点和当前的点之间,目标数据库中撤销和回滚段的当前物理结构必须没有变化。回滚段在恢复期间不能发生变化。
(2)完成指定表空间的TSPITR后,这个表空间以前的所有备份就不能在用于以后的TSPITR。这就是TSPITR后的表空间备份操作非常重要的原因,只有再次备份表空间后才能执行下一个TSPITR.