在Oracle 12c之前的版本中,rman进行数据恢复时只能进行database/tablespace/datafile/block四种级别的恢复,如果误操作删除某张表或表中数据,无法通过闪回进行数据还原时,且有完整备份以及归档,该种情况下可以进行表空间时间点恢复,但恢复方式较麻烦,在Oracle12c中,Oracle对rman功能进行了增强,除了之前的四种级别的恢复,rman也提供了表/表分区级别的恢复,该特性可以直接从现有的rman备份中来恢复表/表分区,且恢复的过程不影响数据库中的其他的对象。
表级别的恢复流程与表空间时间点恢复流程相似,只是Oracle对手工的表空间时间点恢复进行了一层封装,恢复时整个流程如下:
1.创建一个辅助实例。
2.在辅助实例中通过备份集对需要恢复的表/表分区所在的数据文件进行restore。
3.recover until scn/timestamp/sequence number。
4.通过数据泵功能将需要恢复的表在辅助数据库中导出到指定目录下。
5.将需要恢复的表导入到生产库中。
6.清理辅助数据库。
指定恢复时间点时可以有以下3种级别:
1.SCN
2.TIME
3.SEQUENCE NUMBER
表/表分区级别的恢复有如下前提:
1.数据库必须处于读写模式。
2.数据库必须处于归档模式。
3.必须存在表/表分区的RMAN备份。
4.当要恢复单个表分区时,COMPATIBLE参数需要设置为11.1.0或更高。
表/表分区级别的恢复存在如下限制:
1.SYS用户下的表/表分区无法进行恢复。
2.SYSTEM/SYSAUX表空间中的表/表分区无法进行恢复。
3.无法恢复备库中的表/表分区。
4.当使用REMAP选项时无法恢复具有NOT NULL约束的表。
关于表/表分区恢复详细信息请参考官方文档,连接如下:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/bradv/rman-recovering-tables-partitions.html#GUID-87B7F772-335F-4179-81C9-91678D026D01
下面演示表级别的恢复,实验使用如下步骤:
1.创建表t,及相应索引idx_t_name。
2.做RMAN全备。
3.查看当前scn。
4.删除表。
5.在rman中恢复表t。
6.检查表中数据是否恢复。
实验过程:
1.创建表t,及相应索引idx_t_name
07:55:36 yyh. pdb18c>create table t(id number, name varchar2(20));
Table created.
Elapsed: 00:00:00.12
07:55:49 yyh. pdb18c>insert into t values(0,'QData');
1 row created.
Elapsed: 00:00:00.07
07:55:59 yyh. pdb18c>insert into t values(1,'QData Cloud');
1 row created.
Elapsed: 00:00:00.00
07:56:04 yyh. pdb18c>commit;
Commit complete.
Elapsed: 00:00:00.01
07:56:05 yyh. pdb18c>create index idx_t_name t(name);
create index idx_t_name t(name)
*
ERROR at line 1:
ORA-00969: missing ON keyword
Elapsed: 00:00:00.00
07:56:23 yyh. pdb18c>create index idx_t_name on t(name);
Index created.
Elapsed: 00:00:00.10
07:56:26 yyh. pdb18c>select * from t;
ID NAME
---------- ------------------------------
0 QData
1 QData Cloud
Elapsed: 00:00:00.03
07:56:33 yyh. pdb18c>
2.做RMAN全备
RMAN> backup database;
Starting backup at 07-AUG-18
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=80 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/ssd2/ora18c/system01.dbf
input datafile file number=00003 name=/ssd2/ora18c/sysaux01.dbf
input datafile file number=00004 name=/ssd2/ora18c/undotbs01.dbf
input datafile file number=00007 name=/ssd2/ora18c/users01.dbf
channel ORA_DISK_1: starting piece 1 at 07-AUG-18
channel ORA_DISK_1: finished piece 1 at 07-AUG-18
piece handle=/ssd2/backup/20180807_full_09t9ukmd_1_1.bak tag=TAG20180807T075908 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00010 name=/ssd2/ora18c/pdb18c/sysaux01.dbf
input datafile file number=00009 name=/ssd2/ora18c/pdb18c/system01.dbf
input datafile file number=00011 name=/ssd2/ora18c/pdb18c/undotbs01.dbf
input datafile file number=00012 name=/ssd2/ora18c/pdb18c/users01.dbf
channel ORA_DISK_1: starting piece 1 at 07-AUG-18
channel ORA_DISK_1: finished piece 1 at 07-AUG-18
piece handle=/ssd2/backup/20180807_full_0at9ukng_1_1.bak tag=TAG20180807T075908 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/ssd2/ora18c/pdbseed/sysaux01.dbf
input datafile file number=00005 name=/ssd2/ora18c/pdbseed/system01.dbf
input datafile file number=00008 name=/ssd2/ora18c/pdbseed/undotbs01.dbf
channel ORA_DISK_1: starting piece 1 at 07-AUG-18
channel ORA_DISK_1: finished piece 1 at 07-AUG-18
piece handle=/ssd2/backup/20180807_full_0bt9uknv_1_1.bak tag=TAG20180807T075908 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
Finished backup at 07-AUG-18
Starting Control File and SPFILE Autobackup at 07-AUG-18
piece handle=/ssd2/softw