例:一个比较复杂的复制命令如下:
RMAN> RUN
{
allocate auxiliary channel newdb1 device type sbt;
duplicate target database to newdb
DB_FILE_NAME_CONVERT=('/h1/oracle/dbs/trgt/','/h2/oracle/oradata/newdb/')
UNTIL TIME 'SYSDATE-1' # specifies incomplete recovery
SKIP TABLESPACE cmwlite, drsys, example # skip desired tablespaces
PFILE = ?/dbs/initNEWDB.ora
LOGFILE
GROUP 1 ('?/oradata/newdb/redo01_1.log',
'?/oradata/newdb/redo01_2. log') SIZE 200K,
GROUP 2 ('?/oradata/newdb/redo02_1. log'',
'?/oradata/newdb/redo02_2. log'') SIZE 200K
GROUP 3 ('?/oradata/newdb/redo03_1. log'',
'?/oradata/newdb/redo03_2. log'') SIZE 200K REUSE;
}
4.7.3表空间时间点恢复(TSPITR)
用户可能错误的删除了几个表,而且还截断了几个表,如果进行整库恢复可能代价比较
高,这时,我们可以执行表空间时间点恢复(tablespace point-in-time recovery,TSPITR)。
为了掌握如何执行TSPITR,应该理解下面这些术语:
辅助实例(auxiliary instance):这是我们创建的临时实例,RMAN使用这个实例执行
TSPITR。完成TSPITR后,这个实例可以删除。
辅助集(auxiliary set):辅助实例上的文件集。包括控制文件、回滚段或者重做段的表 空间、系统表空间、联机日志文件等,还可以选择辅助实例的临时表空间。
恢复集(recovery set):要执行TSPITR的表空间/数据文件集
目标数据库:实际执行TSPITR的数据库
TSPITR的本质是,RMAN将要进行时间点恢复的表空间按照设定的条件恢复到辅助 实例上,然后再从辅助实例将表空间传到目标数据库,从而避免整个数据库的恢复,减少恢复时间,而且这期间其他表空间仍然可用。(用户管理的备份与恢复也可以使用TSPITR)
检查TSPITR之后丢失的对象,被丢失对象信息的获取:
SQL> Select owner, name
From TS_PITR_OBJECTS_TO_BE_DROPPED
Where tablespace_name = 'USER01' And creation_time >
to_date( '2004-09-27 11:25:21', 'yyyy-mm-dd hh24:mi:ss' );
进行TSPITR的基本步骤是(与有些书上的步骤略有不同):
(0)检查需要恢复的表空间的数据文件备份和控制文件备份是否存在
(1)验证表空间的可传输性
(2)准备辅助实例
(3)执行实际的TSPITR
(4)在目标数据库上执行TSPITR后的操作。
1.验证表空间的可传输性
RMAN使用Oracle可传送的表空间特性来执行TSPITR,因此表空间本身必须是可传送
的。许多因素都导致表空间不可传送。
TSPITR限制
不能还原包含SYS用户对象
不能执行TSPITR恢复具有复制主表的表空间 不支持使用快照日志的表空间 不能还原含有回滚段的表空间
不能还原含有分区对象(该对象的分区跨越多个表空间)的表空间 表空间中不能含有VARRAY、嵌套表、外部表对象
TSPITR不能用于恢复删除的表空间。
可以通过TS_PITR_CHECK视图来判断表空间是否可传送。如果表空间不可传送,那么执行TSPITR时就会失败。下面是查询USERS表空间是否可传送的语句:
SQL> SELECT OBJ1_NAME "Object Owner",obj1_name "Object Name", obj1_type "Object Type",ts1_name "Tablespace Name",reason
FROM TS_PITR_CHECK WHERE ts1_name='USERS';
如果未选定行,说明USERS表空间可传输。
2.准备TSPITR的辅助实例(AUXILIARY INSTANCE)
启动TSPITR之前,需要准备辅助实例。这是一个不需要RMAN参与的手工过程。执
行下面的步骤来创建辅助实例:
u创建口令文件
u创建辅助实例的参数文件: 编辑辅助实例参数文件的一个简单方法是把目标数据库的参数文件改一下即可。如果目标数据库用的是SPFILE,那么在SQLPLUS中执行CREATE PFILE FROM SPFILE就可以生成参数文件。
注意:
control_files设置为辅助实例上的文件名
db_name =目标实例
lock_name_space如果辅助实例与目标数据库同一主机,必须设置instance_name service_names取一新名,如AUX db_file_name_convert数据文件名的转换
log_file_name_convert日志文件名的转换
注释掉log_archive_start参数
u如果在Windows NT上运行Oracle,需要使用oradim来添加数据库服务
u启动辅助实例,如有必要,配置tnsnames.ora,测试是否连通。
3.执行实际的TSPITR
例子: 恢复用户误删除的某个重要的表。将实例MING的USERS表空间恢复到SCN
是3818161的时候。
启动辅助实例:
C:\>SET ORACLE_SID=AUX1
C:\>SQLPLUS /NOLOG
SQL> CONNECT / AS SYSDBA SQL> STARTUP NOMOUNT;
请注意,SET ORACLE_SID=AUX1很重要,这样就可以不用配置TNSNAMES.ORA
执行实际的TSPITR首先要连到目标数据库和辅助实例。可以联到恢复目录,也可以不连到恢复目录:C:\> SET ORACLE_SID=AUX1
C:\> RMAN TARGET /@MING CATALOG RMAN/RMAN@RECO AUXILIARY /
RMAN> RECOVER TAB LESPACE USERS UNTIL SCN 233646;
…
等待完成表空间的恢复。当然也可以用UNTIL TIME或者UNTIL SEQUENCE子 句,例:
RMAN> run {
allocate auxiliary channel c1 device type disk;
recover tablespace user02 until logseq 9;
}
(这里有些版本有一个ORACLE的BUG,执行到最后可能会报错,需要打补丁?? )
可以改变辅助集/恢复集数据文件的位置和名称:
set newname for datafile 5 to 'c:\demo\user01.dbf';
configure auxname for datafile 1 to '/backup/xxx.dbf’;
在初始化参数文件中用DB_FILE_NAME_CONVERT进行转换
10g中增加了auxiliary destination,更方便
RMAN> recover tablespace user01 until logseq 19 auxiliary destination 'd:\auxiliary';
4.执行TSPITR后的操作
首先应该重新连接RMAN与目标数据库,并且备份刚恢复的表空间。完成备份后, 需要将表空间联机(RMAN在TSPITR后使表空间脱机)。最后,我们还要关闭或删除辅 助数据库。
4.7.4块媒体恢复Block Media Recovery (BMR)
产生块损坏的原因一般是间断或随机的I/O错误或者是内存的块错误。要恢复的坏块信息可以从报警与跟踪文件,表与索引的分析,DBV工具或第三方媒体管理工具以及具体 的查询语句中获得。
1. DBV工具dbv file=EYGLE.DBF blocksize=8192
2. RMAN> backup validatedatafile 4; --或者BACKUP VALIDATE DATABASE
备份的 坏 块 信息 保存 在V$BACKUP_CORRUPTION、V$COPY_CORRUPTION和
V$DATABASE_BLOCK_CORRUPTION视图中。
V$BACKUP_CORRUPTION显示历史讹误的视图 V$DATABASE_BLOCK_CORRUPTION显示当前数据块讹误的视图。 一旦修正了数据库的块讹误,就需要重新运行BACKUP VALIDATE DATABASE命令,
然后确认V$DATABASE_BLOCK_CORRUPTION中没有其他讹误。
RMAN可以备份包含损坏数据块的数据文件,通过设置set maxcorrupt可以跳过指定
个数的坏块来避免备份失败。
RMAN> set maxcorrupt for datafile 1 to 0;
在Oracle9i中可以用RMAN来执行块级的恢复,而且恢复期间数据文件可以是联机状态。RMAN通过Block Media Recovery(简称BMR)来执行块级恢复操作。假设我们在查 询一个Oracle表的时候接收到下面的错误:
ERROR位于第1行:
ORA-01578: ORACLE数据块损坏(文件号5,块号97)
ORA-01110:数据文件5: 'E:\xxxx.dbf'
那么我们就可以在RMAN中用BLOCKRECOVER命令来修复:
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK97;启动blockrecover于03-9月-06正在启动全部恢复目录的resync
完成全部resync
使用通道ORA_DISK_1
通道ORA_DISK_1:正在从数据文件副本E:\xxxx.bak恢复块
正在开始介质的恢复
完成介质的恢复
完成blockrecover于03-9月-06
恢复V$DATABASE_BLOCK_CORRUPTION视图中列出的坏块:
RMAN> blockrecover corruption list [ restore until time 'sysdate - 10' ];
恢复指定坏块:
RMAN> blockrecover datafile 2 block 12,13 datafile 9 block 19;
RMAN> blockrecover tablespace system dba 44404,44405 from tag "weekly_backup"; RMAN> blockrecover tablespace system dba 44404,44405 restore until time 'sysdate-2';
4.7.5使用恢复目录恢复前一个对应物
在不完全恢复完成之后,通常需要使用resetlogs选项来打开数据库。resetlogs表示 一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期 也被称为一个对应物(incarnation)。每次使用resetlogs选项来打开数据库后都会创建一个新的数据库对应物。
使用RMAN可以进行穿越resetlogs的恢复,即可以恢复到前一个对应物。10g版本 增强了这方面的功能。
(1)使用恢复目录的情况使用恢复目录的情况下,恢复前一个对应物是非常简单的。 首先,用list incarnation;来显示有哪些对应物:
RMAN> list incarnation;
数据库Incarnations列表
DB关键字Inc关键字DB名DB ID CUR重置SCN重置时间
1
2
MING
2600315304
NO
1
20-4月
-06
1
854
MING
2600315304
NO
3407561
19-8月
-06
1
4368
MING
2600315304
NO
3794049
29-8月
-06
1
4437
MING
2600315304
NO
3794728
29-8月
-06
1
4639
MING
2600315304
YES
3794935
29-8月
-06
待续。。。。。