oracle12C―RMAN表级恢复


Oracle数据库备份主要分为两类:逻辑和物理备份。每种备份类型都有其自身的优缺点。在之前的版本中,利用现有物理备份来恢复表或分区是不可行的。为了恢复特定对象,逻辑备份是必需的。

在Oracle12c 版本中,你可以在发生drop或truncate的情况下从RMAN备份将一个特定的表或分区恢复到某个时间点或SCN。


RMAN的表级和表分区级恢复应用场景:

1、您需要将非常少量的表恢复到特定的时间点。在这种情况下,TSPITR 不是最有效的解决方案,因为它将表空间中的所有对象都移动到指定的时间点。

2、您需要恢复已被逻辑损坏或已被删除和清除的表。

3、Flashback Table 不可用,如undo 数据已经被覆盖。

4、恢复在DDL操作修改表结构之后丢失的数据。使用Flashback表是不可能的,因为在需要的时间点和当前时间之间的表上运行一个DDL。闪回表不能通过诸 如截断表操作之类的结构更改来倒表。


RMAN的表级和表分区级恢复限制:

①:SYS用户表或分区无法恢复

②:存储于SYSAUX和SYSTEM表空间下的表和分区无法恢复

③:当REMAP选项用来恢复的表包含NOT NULL约束时,恢复此表是不可行的

④:在备库上的表和分区表不能恢复


RMAN的表级和表分区级恢复前提:

1、The target database must be in read-write mode.

2、The target database must be in ARCHIVELOG mode.

3、You must have RMAN backups of the tables or table partitions as they existed at the point in time to which you want recover these objects.

4、To recover single table partitions,the COMPATIBLE initialization parameter for target database must be set to 11.1.0 or higher.


恢复方法:

1、SCN

2、Time

3、Sequence number


RMAN从备份中自动处理恢复表或者表分区时的步骤:


1.确定哪些备份包含需要恢复的表或表分区,根据指定的时间来进行恢复。

2.确定目标主机上是否有足够的空间来创建将在表或分区恢复过程中使用的辅助实例。 如果需要的空间不足,那么RMAN会报错并退出恢复操作。

3.创建一个辅助数据库并恢复指定的表或表分区,并根据指定的时间来恢复指定的表或表分区到辅助数据库中。 可以指定用于存储已恢复表或表分区的元数 据的导出转储文件名称和位置。

4.创建一个数据泵导出转储文件,其中包含已恢复的表或表分区。可以指定用于存储已恢复表或表分区的元数据的导出转储文件名称和位置。

5.(可选操作)将上一步生产的数据泵文件导入到目标实例中。您可以选择不导入包含已恢复的表或表分区到目标数据库的导出转储文件。如果您不导入导 出转储文件作为恢复过程的一部分,那么您必须在稍后使用 impdp 手工导入。

6.(可选操作)在目标数据库中rename 恢复表或表分区。


准备测试环境:Oracle12.2

[oracle@localhost~]$sqlplus'/assysdba'
sql*Plus:Release12.2.0.1.0ProductiononMonJul2412:39:292017
Copyright(c)1982,2016,Oracle.Allrightsreserved.
Connectedto:
OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProduction
sql>



一、恢复PDB中的表

①:在pdb中创建测试表:

[oracle@localhost~]$sqlplusadmin/admin@192.168.2.100/testpdb
sql*Plus:Release12.2.0.1.0ProductiononFriJul2116:28:242017
Copyright(c)1982,Oracle.Allrightsreserved.
LastSuccessfullogintime:FriJul21201716:27:50+08:00
Connectedto:
OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProduction
sql>altersessionsetnls_date_format='yyyy-mm-ddhh24:mi:ss';
Sessionaltered.
sql>selectsysdatefromdual;---查看当前时间
SYSDATE
-------------------
2017-07-2116:29:06
sql>createtableempasselect*fromdba_objects;----创建测试表emp
Tablecreated.
sql>selectsysdatefromdual;---查看当前时间
SYSDATE
-------------------
2017-07-2116:29:23
sql>


②:备份全库

[oracle@localhost~]$rmantarget/
RecoveryManager:Release12.2.0.1.0-ProductiononFriJul2116:30:052017
Copyright(c)1982,2017,Oracleand/oritsaffiliates.Allrightsreserved.
connectedtotargetdatabase:ORCL(DBID=1476406003)
RMAN>backupdatabaseformat='/home/oracle/bak/fulldb_%d_%U';----该备份会备份CDB及所有的pdb
Startingbackupat21-JUL-17
usingtargetdatabasecontrolfileinsteadofrecoverycatalog
allocatedchannel:ORA_DISK_1
channelORA_DISK_1:SID=59devicetype=DISK
channelORA_DISK_1:startingfulldatafilebackupset
channelORA_DISK_1:specifyingdatafile(s)inbackupset
inputdatafilefilenumber=00001name=/opt/oracle/oradata/orcl/system01.dbf
inputdatafilefilenumber=00003name=/opt/oracle/oradata/orcl/sysaux01.dbf
inputdatafilefilenumber=00013name=/opt/oracle/oradata/orcl/system02.dbf
inputdatafilefilenumber=00014name=/opt/oracle/oradata/orcl/sysaux02.dbf
inputdatafilefilenumber=00004name=/opt/oracle/oradata/orcl/undotbs01.dbf
。。。。。。。。省略


③:登录pdb中,删除测试表

[oracle@localhost~]$sqlplusadmin/admin@192.168.2.100/testpdb
sql*Plus:Release12.2.0.1.0ProductiononFriJul2116:35:152017
Copyright(c)1982,Oracle.Allrightsreserved.
LastSuccessfullogintime:FriJul21201716:28:24+08:00
Connectedto:
OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProduction
sql>altersessionsetnls_date_format='yyyy-mm-ddhh24:mi:ss';
sql>selectsysdatefromdual;----查看当前时间
SYSDATE
-------------------
2017-07-2116:35:56
sql>createtabletest_empasselect*fromdba_objects;---再创建一个测试表test_emp
sql>selectcurrent_scnfromv$database;---查看当前数据库的SCN号,一会用于恢复使用
CURRENT_SCN
-----------
1664487
sql>commit;
sql>selectsysdatefromdual;
SYSDATE
-------------------
2017-07-2116:37:04
sql>droptableemp;----删除第一个刚才备份的测试表emp
Tabledropped.
sql>selectsysdatefromdual;
SYSDATE
-------------------
2017-07-2116:38:31
sql>droptabletest_emp;----再删除刚刚创建的测试表test_emp(注意该表没有备份)
sql>selectcurrent_scnfromv$database;----删除表后,再查看当前数据库的SCN
CURRENT_SCN
-----------
1665210
sql>selectcurrent_scnfromv$database;
CURRENT_SCN
-----------
1665213
sql>
-----注意:上面的操作我们可以看出我们一共创建了两张表,一张表emp备份了,另外一张test_emp是备份后创建的,我们都删除了,接下来进行恢复


④:rman恢复pdb中的表

[oracle@localhost~]$rmantarget/
RecoveryManager:Release12.2.0.1.0-ProductiononFriJul2117:32:242017
Copyriht(c)1982,Oracleand/oritsaffiliates.Allrightsreserved.
connectedtotargetdatabase:ORCL(DBID=1476406003)
RMAN>recovertableadmin.test_empOFPLUGGABLEDATABASEtestpdbuntilscn1664487auxiliarydestination'/opt/oracle/test';---因为是备份pdb中的表,所以要指定pdb
auxiliaryinstancefile/opt/oracle/test/ORCL/539E6DBB875552F2E055000000000001/datafile/o1_mf_temp_dq3l21wf_.tmpdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/datafile/o1_mf_temp_dq3l1tmp_.tmpdeleted
auxiliaryinstancefile/opt/oracle/test/KSFR_PITR_TESTPDB_ORCL/onlinelog/o1_mf_3_dq3l4kg0_.logdeleted
auxiliaryinstancefile/opt/oracle/test/KSFR_PITR_TESTPDB_ORCL/onlinelog/o1_mf_2_dq3l47rl_.logdeleted
auxiliaryinstancefile/opt/oracle/test/KSFR_PITR_TESTPDB_ORCL/onlinelog/o1_mf_1_dq3l47nn_.logdeleted
auxiliaryinstancefile/opt/oracle/test/KSFR_PITR_TESTPDB_ORCL/539E6DBB875552F2E055000000000001/datafile/o1_mf_test_dq3l3xdf_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/539E6DBB875552F2E055000000000001/datafile/o1_mf_sysaux_dq3l0sf7_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/datafile/o1_mf_sysaux_dq3kyd0s_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/datafile/o1_mf_sysaux_dq3kyd0g_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/539E6DBB875552F2E055000000000001/datafile/o1_mf_undotbs1_dq3l0sg1_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/datafile/o1_mf_undotbs1_dq3kyd0x_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/539E6DBB875552F2E055000000000001/datafile/o1_mf_system_dq3l0sfc_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/datafile/o1_mf_system_dq3kyd0m_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/datafile/o1_mf_system_dq3kyd05_.dbfdeleted
auxiliaryinstancefile/opt/oracle/test/ORCL/controlfile/o1_mf_dq3ky1cb_.ctldeleted
auxiliaryinstancefiletspitr_ksFr_40802.dmpdeleted
Finishedrecoverat21-JUL-17
-----日志部分省略,这就算恢复完成了,
----补充
RMAN>recovertableadmin.test_empOFPLUGGABLEDATABASEtestpdbuntilscn1664487auxiliarydestination'/opt/oracle/test'remaptableadmin.test_emp:test_empbak;---将恢复的表重命名



⑤:验证是否恢复完成:

sql>selectcount(*)fromemp;
COUNT(*)
----------
72633
sql>selectcount(*)fromtest_emp;
COUNT(*)
----------
72634

---从上面的查询情况可以得知,恢复是完整的,没有问题;但是,大家肯定有个疑问,那就是为什么我没有进行备份的表怎么还恢复成功了,有疑问的可以去看看官方文档,多了解下恢复的原理。


二、Oracle12C(无pdb级的表恢复)

---在安装的过程中没有选择PDB的特性,把Oracle12C和之前的版本一样使用安装的方式:

恢复的流程是和上面PDB级恢复一样的,只是在恢复的命令上有差别,如:

RMAN> recover table admin.emp until scn 1665210 remap table admin.emp:emp_bak auxiliary destination '/hoem/oracle/bak';


注意:

①:分区表的恢复方法也是同样的

②:即使表emp做了DDL操作修改了表结构,也可以用这种方法进行恢复的;


Oracle12Crman恢复表的详细内容请查看官方文档:

http://docs.oracle.com/database/121/BRADV/rcmresind.htm#BRADV686

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...