当前位置: 首页 >> 技术文章 >> 12c RMAN新特性之Recover Table
12c RMAN新特性之Recover Table
发布时间:2018-08-14 发布人:周玉其 1493


在 Oracle 12c 之前,如果误删一张表,常规的方法是 Flashback 闪回或 TSPITR。而开启 flashback 会消耗磁盘空间,且如果被 purge 或者经过 DDL,将无法 flashback。如果需要恢复的表空间过大,TSPITR 会耗时非常久。12c 中提供了Table Recovery 的新特性,可以针对单表(或单个表分区)基于时间点进行恢复,该特性用以直接从 RMAN 备份中恢复表的方法,该特性有以下特点:


  • 不影响数据库中的其他数据库对象

  • 减少时间和磁盘空间的消耗,和早期的 TSPIRT 工作流程类似

  • 从另一个磁盘路径恢复表空间

  • 导出想要的表数据

  • 导入到原数据库(可选)

 

recover table 可以将一个或多个表或表分区恢复到指定的时间点,而不会影响其余的数据库对象。可以使用以前创建的 RMAN 备份将表和表分区恢复到指定的时间点。

该表被恢复到一个辅助实例中,并且可以选择:

  • 使用 REMAP 选项将恢复的表导入新表或分区

  • 仅在恢复的表中创建 expdp dump 文件,以便在其他时间进行导入

 


先决条件



目标数据库必须处于读写模式。

目标数据库必须处于 ARCHIVELOG 模式。


您必须拥有表或表分区的 RMAN 备份,因为它们存在于要恢复这些对象的时间点。

要恢复单个表分区,目标数据库的 COMPATIBLE 初始化参数必须设置为 11.1.0 或更高。


请确保 AUXILIARY DESTINATION 有足够的空间来恢复 system、sysaux、undo 以及恢复表所需的表空间。


请注意,表恢复后,辅助目标中的这些文件将自动删除

必须使用 AUXILIARY DESTINATION 子句和后面其中一个子句来指定恢复的时间点:UNTIL TIME、UNTIL SCN 或 UNTIL SEQUENCE。

 


使用限制


  •  属于SYS模式的表和表分区无法恢复。

  •  SYSTEM和SYSAUX表空间中的表和表分区无法恢复。

  •  standby数据库上的表和表分区无法恢复。

  •  命名为NOT NULL约束的表不能用REMAP选项恢复。



使用场景

RMAN 的表级和表分区级恢复在以下场景中非常适用:

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

(2) 需要恢复已被逻辑损坏或已被 drop 和 purge 的表。

(3) flashback 不可用,比如需要的 undo 数据被覆盖。

(4) DDL 操作修改表结构后丢失的数据。flashback table 不能跨越 DDL(例如truncate)来回滚表。

 


在这Recover table 过程演示



创建测试表



SQL> create table t_recover_test as select * from dba_objects;  

 

Table created.

 

SQL> select count(*) from t_recover_test;

 

COUNT(*)

----------

 72652

 


备份



[oracle@localhost ~]$ rman target /

 

Recovery Manager: Release 12.2.0.1.0 - Production on Thu Jun 28 21:06:17 2018

 

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

 

connected to target database: PCC (DBID=3164878903)

 

RMAN> backup database format '/home/oracle/bak/db_%U';

 

Starting backup at 28-JUN-18

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=61 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=/home/oracle/oradata/pcc/system01.dbf

input datafile file number=00003 name=/home/oracle/oradata/pcc/sysaux01.dbf

input datafile file number=00004 name=/home/oracle/oradata/pcc/undotbs01.dbf

input datafile file number=00005 name=/home/oracle/oradata/pcc/tbs_zyq01.dbf

input datafile file number=00007 name=/home/oracle/oradata/pcc/users01.dbf

channel ORA_DISK_1: starting piece 1 at 28-JUN-18

channel ORA_DISK_1: finished piece 1 at 28-JUN-18

piece handle=/home/oracle/bak/db_01t6k254_1_1 tag=TAG20180628T215236 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15

Finished backup at 28-JUN-18

 

Starting Control File and SPFILE Autobackup at 28-JUN-18

piece handle=/u01/app/oracle/product/12.2.0.1/dbs/c-3164878903-20180628-00 comment=NONE

Finished Control File and SPFILE Autobackup at 28-JUN-18

 


恢复表




contents of Memory Script:

{

# set requested point in time

set until  time "to_date('2018-06-28 23:56:06','yyyy-mm-dd hh24:mi:ss')";

# set destinations for recovery set and auxiliary set datafiles

set newname for datafile  5 to new;

# restore the tablespaces in the recovery set and the auxiliary set

restore clone datafile  5;

 

switch clone datafile all;

}

executing Memory Script

 

executing command: SET until clause

 

executing command: SET NEWNAME

 

Starting restore at 29-JUN-18

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: SID=34 device type=DISK

 

channel ORA_AUX_DISK_1: starting datafile backup set restore

channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_AUX_DISK_1: restoring datafile 00005 to /data01/HCED_PITR_PCC/datafile/o1_mf_tbs_zyq_%u_.dbf

channel ORA_AUX_DISK_1: reading from backup piece /home/oracle/bak/db_01t6k254_1_1

channel ORA_AUX_DISK_1: piece handle=/home/oracle/bak/db_01t6k254_1_1 tag=TAG20180628T215236

channel ORA_AUX_DISK_1: restored backup piece 1

channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03

Finished restore at 29-JUN-18

 

datafile 5 switched to datafile copy

input datafile copy RECID=8 STAMP=980038478 file name=/data01/HCED_PITR_PCC/datafile/o1_mf_tbs_zyq_fmcsfttn_.dbf

 

contents of Memory Script:

{

# set requested point in time

set until  time "to_date('2018-06-28 23:56:06','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  5 online";

# recover and open resetlogs

recover clone database tablespace  "TBS_ZYQ", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;

alter clone database open resetlogs;

}

executing Memory Script

 

executing command: SET until clause

 

sql statement: alter database datafile  5 online

 

Starting recover at 29-JUN-18

using channel ORA_AUX_DISK_1

 

starting media recovery

 

archived log for thread 1 with sequence 3 is already on disk as file /u01/app/oracle/product/12.2.0.1/dbs/arch1_3_979872889.dbf

archived log for thread 1 with sequence 4 is already on disk as file /u01/app/oracle/product/12.2.0.1/dbs/arch1_4_979872889.dbf

archived log file name=/u01/app/oracle/product/12.2.0.1/dbs/arch1_3_979872889.dbf thread=1 sequence=3

archived log file name=/u01/app/oracle/product/12.2.0.1/dbs/arch1_4_979872889.dbf thread=1 sequence=4

media recovery complete, elapsed time: 00:00:01

Finished recover at 29-JUN-18

 

database opened

 

contents of Memory Script:

{

# create directory for datapump import

sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''

/data01''";

# create directory for datapump export

sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''

/data01''";

}

executing Memory Script

 

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/data01''

 

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/data01''

 

Performing export of tables...

   EXPDP> Starting "SYS"."TSPITR_EXP_hCed_Dhxe":  

   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER

   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE

   EXPDP> . . exported "ZYQ"."T_RECOVER_TEST"                      9.324 MB   72652 rows

   EXPDP> Master table "SYS"."TSPITR_EXP_hCed_Dhxe" successfully loaded/unloaded

   EXPDP> ******************************************************************************

   EXPDP> Dump file set for SYS.TSPITR_EXP_hCed_Dhxe is:

   EXPDP>   /data01/tspitr_hCed_71393.dmp

   EXPDP> Job "SYS"."TSPITR_EXP_hCed_Dhxe" successfully completed at Fri Jun 29 00:55:41 2018 elapsed 0 00:00:35

Export completed

 

contents of Memory Script:

{

# shutdown clone before import

shutdown clone abort

}

executing Memory Script

 

Oracle instance shut down

 

Performing import of tables...

   IMPDP> Master table "SYS"."TSPITR_IMP_hCed_Arhm" successfully loaded/unloaded

   IMPDP> Starting "SYS"."TSPITR_IMP_hCed_Arhm":  

   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE

   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

   IMPDP> . . imported "ZYQ"."T_RECOVER_TEST_MAP"                  9.324 MB   72652 rows

   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER

   IMPDP> Job "SYS"."TSPITR_IMP_hCed_Arhm" successfully completed at Fri Jun 29 00:56:43 2018 elapsed 0 00:00:45

Import completed

 

Removing automatic instance

Automatic instance removed

auxiliary instance file /data01/PCC/datafile/o1_mf_temp_fmcsd5ny_.tmp deleted

auxiliary instance file /data01/HCED_PITR_PCC/onlinelog/o1_mf_3_fmcsg3y6_.log deleted

auxiliary instance file /data01/HCED_PITR_PCC/onlinelog/o1_mf_2_fmcsg07o_.log deleted

auxiliary instance file /data01/HCED_PITR_PCC/onlinelog/o1_mf_1_fmcsfzr1_.log deleted

auxiliary instance file /data01/HCED_PITR_PCC/datafile/o1_mf_tbs_zyq_fmcsfttn_.dbf deleted

auxiliary instance file /data01/PCC/datafile/o1_mf_sysaux_fmcsc75c_.dbf deleted

auxiliary instance file /data01/PCC/datafile/o1_mf_undotbs1_fmcsc75h_.dbf deleted

auxiliary instance file /data01/PCC/datafile/o1_mf_system_fmcsc755_.dbf deleted

auxiliary instance file /data01/PCC/controlfile/o1_mf_fmcsc00p_.ctl deleted

auxiliary instance file tspitr_hCed_71393.dmp deleted

Finished recover at 29-JUN-18

 

RMAN>

 


验证



SQL> select count(*) from T_RECOVER_TEST_MAP;

 

  COUNT(*)

----------

     72652



总结



(1) 根据为恢复指定的时间点确定哪个备份包含需要恢复的表或表分区。

(2) 确定目标主机上是否有足够的空间来创建将在表或分区恢复过程中使用的辅助实例。如果所需空间不可用,则 RMAN 会显示错误并退出恢复操作。

(3) 在目标主机上创建一个辅助数据库,并将指定的表或表分区恢复到此辅助数据库中,直到指定的时间点。您可以指定恢复的数据文件存储在辅助数据库中的目标主机上的位置。

(4) 创建包含恢复的表或表分区的数据泵导出转储文件。您可以指定用于存储恢复的表或表分区的元数据的数据泵导出转储文件的名称和位置。

(5) (可选)将 Data Pump 导出转储文件导入到目标实例中。您可以选择不将包含恢复的表或表分区的导出转储文件导入目标数据库。如果不将导出转储文件作为恢复过程的一部分导入,则必须稍后使用“数据泵导入”实用程序手动导入它。

注:如果在导入操作期间发生错误,RMAN 不会在表恢复结束时删除导出转储文件。这使您能够手动导入转储文件。

(6) (可选)重命名目标数据库中已恢复的表或表分区。您还可以将恢复的对象导入到与最初存在的表空间或模式不同的表空间或模式中。12.2 开始,schema 可不同

注:当您使用 REMAP 选项时,不会导入任何指定的约束和索引。这是为了避免与现有表格的名称冲突。

 

如果不希望表被导入,只需要恢复出 dmp 文件,可以使用 notableimport 选项,命令如下:

RECOVER TABLE SCOTT.EMP, SCOTT.DEPT    UNTIL TIME 'SYSDATE-1'    AUXILIARY DESTINATION '/tmp/oracle/recover'    DATAPUMP DESTINATION '/tmp/recover/dumpfiles'    DUMP FILE 'emp_dept_exp_dump.dat'    NOTABLEIMPORT;

 

如果需要将表恢复至另外的 schema,命令如下:

RECOVER TABLE HR.DEPARTMENTS, SH.CHANNELS

UNTIL TIME 'SYSDATE – 1' AUXILIARY DESTINATION '/tmp/auxdest'

REMAP TABLE hr.departments:example.new_departments, sh.channels:example.new_channels;