Oracle 12c 新特性之 table recovery from rman backups

    在12c中,我们可以使用RMAN做表级别的恢复,可以一次恢复单个、多个表、表分区。当恢复的数据比较少而备份非常大时,这个特性能减少我们的工作量,逻辑损坏、误删除更新、DROP等操作带来的数据丢失可以使用这种方法找回来。

Table recovery时会经历如下过程:

a)   检查恢复的表在哪个备份中,并选择合适的备份

b)   创建辅助数据库,并把该库恢复到指定时间,需要DBA指定一个路径来存放辅助数据库

c)   创建包含恢复后表数据的export_dump_file

d)   (可选)将上步导出的export_dump_file导入目标数据库

e)   (可选)重命名导入后的表名称

   下面几种情况是不能做表恢复的:

a)   SYS 用户的表

b)   SYSTEM SYSAUX表空间内的表

c)   表含有NOT NULL约束时不能使用REMAP选项

指定恢复点时,可以通过指定SCN  、TIME 、SEQUENCE NUMBER来确定

 

准备一个表,并插入一些数据

SQL> alter session setnls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select sysdate from dual;

SYSDATE

-------------------

2013-08-08 13:36:09

SQL> create table t(msg varchar2(20)) tablespaceusers;

表已创建。

SQL> insert into t select sysdate from dual;

已创建 1 行。

SQL> insert into t select sysdate from dual;

已创建 1 行。

SQL> insert into t select sysdate from dual;

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

MSG

----------------------------------------

2013-08-08 13:36:54

2013-08-08 13:36:56

2013-08-08 13:36:57

 

RMAN数据库备份:

RMAN> backup format '/u01/backup/%U.bkp'database include current controlfile spfile

plus archivelog;

启动 backup 于 08-8月 -13

当前日志已存档

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在启动归档日志备份集

通道 ORA_DISK_1: 正在指定备份集内的归档日志

….

….

….

查询当前时间,确定恢复的时间点,然后删除表:

SQL> select sysdate from dual;

SYSDATE

-------------------

2013-08-08 13:41:24

SQL> drop table t purge;

表已删除。

SQL> show recyclebin;

ORIGINAL NAME    RECYCLEBIN NAME    OBJECT TYPE  DROP TIME

---------------- ------------------------------------------ -------------------

LIHM_OBJ_NEW BIN$42gujkX2SzXgQycCqMBAEA==$0 TABLE        2013-08-08:13:35:23

SQL> purge recyclebin;

回收站已清空。

SQL> show recyclebin;

SQL> select * from t;

select * from t

              *

第 1 行出现错误:

ORA-00942: 表或视图不存在

此时表已经被删除了

 

使用RMAN做表恢复,输出日志比较长,但流程比较清晰,为便于分析把所有日志都贴上来了:

[oracle@hadoop3 backup]$ rman target sys@orcl

恢复管理器: Release 12.1.0.1.0 - Production on 星期四 8月 8 13:44:25 2013

Copyright (c) 1982, 2013, Oracle and/or itsaffiliates.  All rights reserved.

目标数据库口令: 

已连接到目标数据库: ORCL (DBID=1350692649)

 

1> recover table LIHM.T

2> until time "to_date('2013-08-0813:41:24','yyyy-mm-dd hh24:mi:ss')"

3> auxiliary destination '/tmp/oratmp' ##注意这个目录一定要存在哦

4> remap table 'LIHM'.'T':'T_NEW';

 

启动 recover 于 08-8月 -13

使用目标数据库控制文件替代恢复目录

当前日志已存档

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=243 设备类型=DISK

RMAN-05026: 警告: 假定以下表空间集适用于指定的时间点

表空间列表要求具有 UNDO 段

表空间 SYSTEM

表空间 UNDOTBS1

使用 SID='cwCb' 创建自动实例

供自动实例使用的初始化参数:

db_name=ORCL

db_unique_name=cwCb_pitr_ORCL

compatible=12.1.0.0.0

db_block_size=8192

db_files=200

sga_target=1G

processes=80

diagnostic_dest=/u01/oracle

db_create_file_dest=/tmp/oratmp

log_archive_dest_1='location=/tmp/oratmp'

#No auxiliary parameter file used

启动自动实例 ORCL

Oracle 实例已启动

系统全局区域总计   1068937216 字节

Fixed Size                     2296576 字节

Variable Size                293602560 字节

Database Buffers             767557632 字节

Redo Buffers                   5480448 字节

自动实例已创建

内存脚本的内容:

{

# set requested point in time

set until time "to_date('2013-08-08 13:41:24','yyyy-mm-dd hh24:mi:ss')";

# restore the controlfile

restore clone controlfile;

# mount the controlfile

sql clone 'alter database mount clone database';

# archive current online log

sql 'alter system archive log current';

}

正在执行内存脚本

正在执行命令: SET until clause

启动 restore 于 08-8月 -13

分配的通道: ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: SID=26 设备类型=DISK

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集

通道 ORA_AUX_DISK_1: 正在还原控制文件

通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/backup/0rogpjh0_1_1.bkp

通道 ORA_AUX_DISK_1: 段句柄 = /u01/backup/0rogpjh0_1_1.bkp 标记 = TAG20130808T133908

通道 ORA_AUX_DISK_1: 已还原备份片段 1

通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01

输出文件名=/tmp/oratmp/ORCL/controlfile/o1_mf_906d2jxj_.ctl

完成 restore 于 08-8月 -13

sql 语句: alter database mount clone database

sql 语句: alter system archive log current

内存脚本的内容:

{

# set requested point in time

set until time "to_date('2013-08-08 13:41:24','yyyy-mm-dd hh24:mi:ss')";

# set destinations for recovery set and auxiliaryset datafiles

set newname for clone datafile  1 to new;

set newname for clone datafile  4 to new;

set newname for clone datafile  3 to new;

set newname for clone tempfile  1 to new;

# switch all tempfiles

switch clone tempfile all;

# restore the tablespaces in the recovery set andthe auxiliary set

restore clone datafile  1, 4, 3;

switch clone datafile all;

}

正在执行内存脚本

正在执行命令: SET until clause

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

临时文件 1 在控制文件中已重命名为 /tmp/oratmp/ORCL/datafile/o1_mf_temp_%u_.tmp

启动 restore 于 08-8月 -13

使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集

通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件

通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 /tmp/oratmp/ORCL/datafile/o1_mf_system_%u_.dbf

通道 ORA_AUX_DISK_1: 将数据文件 00004 还原到 /tmp/oratmp/ORCL/datafile/o1_mf_undotbs1_%u_.dbf

通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 /tmp/oratmp/ORCL/datafile/o1_mf_sysaux_%u_.dbf

通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/backup/0qogpjft_1_1.bkp

通道 ORA_AUX_DISK_1: 段句柄 = /u01/backup/0qogpjft_1_1.bkp 标记 = TAG20130808T133908

通道 ORA_AUX_DISK_1: 已还原备份片段 1

通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:35

完成 restore 于 08-8月 -13

数据文件 1 已转换成数据文件副本

输入数据文件副本 RECID=4 STAMP=822923131 文件名=/tmp/oratmp/ORCL/datafile/o1_mf_system_906d2qsn_.dbf

数据文件 4 已转换成数据文件副本

输入数据文件副本 RECID=5 STAMP=822923131 文件名=/tmp/oratmp/ORCL/datafile/o1_mf_undotbs1_906d2qtl_.dbf

数据文件 3 已转换成数据文件副本

输入数据文件副本 RECID=6 STAMP=822923131 文件名=/tmp/oratmp/ORCL/datafile/o1_mf_sysaux_906d2qt7_.dbf

内存脚本的内容:

{

# set requested point in time

set until time "to_date('2013-08-08 13:41:24','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  1 online";

sql clone "alter database datafile  4 online";

sql clone "alter database datafile  3 online";

# recover and open database read only

recover clone database tablespace  "SYSTEM", "UNDOTBS1","SYSAUX";

sql clone 'alter database open read only';

}

正在执行内存脚本

正在执行命令: SET until clause

sql 语句: alter database datafile  1 online

sql 语句: alter database datafile  4 online

sql 语句: alter database datafile  3 online

启动 recover 于 08-8月 -13

使用通道 ORA_AUX_DISK_1

正在开始介质的恢复

线程 1 序列 24 的归档日志已作为文件/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_24_906cs3t0_.arc存在于磁盘上

线程 1 序列 25 的归档日志已作为文件/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_25_906d23gy_.arc存在于磁盘上

归档日志文件名=/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_24_906cs3t0_.arc线程=1 序列=24

归档日志文件名=/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_25_906d23gy_.arc线程=1 序列=25

介质恢复完成, 用时: 00:00:00

完成 recover 于 08-8月 -13

sql 语句: alter database open read only

内存脚本的内容:

{

   sql clone"create spfile from memory";

   shutdownclone immediate;

   startupclone nomount;

   sql clone"alter system set  control_files =

 ''/tmp/oratmp/ORCL/controlfile/o1_mf_906d2jxj_.ctl'' comment=

 ''RMAN set''scope=spfile";

   shutdownclone immediate;

   startupclone nomount;

# mount database

sql clone 'alter database mount clone database';

}

正在执行内存脚本

sql 语句: create spfile from memory

数据库已关闭

数据库已卸装

Oracle 实例已关闭

已连接到辅助数据库 (未启动)

Oracle 实例已启动

系统全局区域总计    1068937216 字节

Fixed Size                     2296576 字节

Variable Size                297796864 字节

Database Buffers             763363328 字节

Redo Buffers                   5480448 字节

sql 语句: alter system set control_files =  ''/tmp/oratmp/ORCL/controlfile/o1_mf_906d2jxj_.ctl'' comment= ''RMANset'' scope=spfile

Oracle 实例已关闭

已连接到辅助数据库 (未启动)

Oracle 实例已启动

系统全局区域总计   1068937216 字节

Fixed Size                     2296576 字节

Variable Size                297796864 字节

Database Buffers             763363328 字节

Redo Buffers                   5480448 字节

sql 语句: alter database mount clone database

内存脚本的内容:

{

# set requested point in time

set until time "to_date('2013-08-08 13:41:24','yyyy-mm-dd hh24:mi:ss')";

# set destinations for recovery set and auxiliaryset datafiles

set newname for datafile  6 to new;

# restore the tablespaces in the recovery set andthe auxiliary set

restore clone datafile  6;

switch clone datafile all;

}

正在执行内存脚本

正在执行命令: SET until clause

正在执行命令: SET NEWNAME

启动 restore 于 08-8月 -13

分配的通道: ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: SID=100 设备类型=DISK

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集

通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件

通道 ORA_AUX_DISK_1: 将数据文件 00006 还原到/tmp/oratmp/CWCB_PITR_ORCL/datafile/o1_mf_users_%u_.dbf

通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/backup/0qogpjft_1_1.bkp

通道 ORA_AUX_DISK_1: 段句柄 = /u01/backup/0qogpjft_1_1.bkp 标记 = TAG20130808T133908

通道 ORA_AUX_DISK_1: 已还原备份片段 1

通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01

完成 restore 于 08-8月 -13

数据文件 6 已转换成数据文件副本

输入数据文件副本 RECID=8 STAMP=822923168 文件名=/tmp/oratmp/CWCB_PITR_ORCL/datafile/o1_mf_users_906d4zog_.dbf

内存脚本的内容:

{

# set requested point in time

set until time "to_date('2013-08-08 13:41:24','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  6 online";

# recover and open resetlogs

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

alter clone database open resetlogs;

}

正在执行内存脚本

正在执行命令: SET until clause

sql 语句: alter database datafile  6 online

启动 recover 于 08-8月 -13

使用通道 ORA_AUX_DISK_1

正在开始介质的恢复

线程 1 序列 24 的归档日志已作为文件/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_24_906cs3t0_.arc存在于磁盘上

线程 1 序列 25 的归档日志已作为文件/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_25_906d23gy_.arc存在于磁盘上

归档日志文件名=/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_24_906cs3t0_.arc线程=1 序列=24

归档日志文件名=/u01/oracle/fast_recovery_area/ORCL/archivelog/2013_08_08/o1_mf_1_25_906d23gy_.arc线程=1 序列=25

介质恢复完成, 用时: 00:00:01

完成 recover 于 08-8月 -13

数据库已打开

内存脚本的内容:

{

# create directory for datapump import

sql "create or replace directoryTSPITR_DIROBJ_DPDIR as ''

/tmp/oratmp''";

# create directory for datapump export

sql clone "create or replace directoryTSPITR_DIROBJ_DPDIR as ''

/tmp/oratmp''";

}

正在执行内存脚本

sql 语句: create or replace directory TSPITR_DIROBJ_DPDIRas ''/tmp/oratmp''

sql 语句: create or replace directory TSPITR_DIROBJ_DPDIRas ''/tmp/oratmp''

正在导出表...

   EXPDP> 启动"SYS"."TSPITR_EXP_cwCb_Ecqy": 

   EXPDP> 正在使用 BLOCKS 方法进行估计...

   EXPDP> 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA

   EXPDP> 使用 BLOCKS 方法的总估计: 64 KB

   EXPDP> 处理对象类型 TABLE_EXPORT/TABLE/TABLE

   EXPDP> 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

   EXPDP> 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/MARKER

   EXPDP>. . 导出了 "LIHM"."T"                                  5.085 KB       3 行

   EXPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_EXP_cwCb_Ecqy"

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

   EXPDP>SYS.TSPITR_EXP_cwCb_Ecqy 的转储文件集为:

  EXPDP>  /tmp/oratmp/tspitr_cwCb_54024.dmp

   EXPDP> 作业 "SYS"."TSPITR_EXP_cwCb_Ecqy" 已于 星期四 8月 8 13:47:14 2013 elapsed 0 00:00:44 成功完成

导出完毕

内存脚本的内容:

{

# shutdown clone before import

shutdown clone abort

}

正在执行内存脚本

Oracle 实例已关闭

正在导入表...

   IMPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_IMP_cwCb_oECq"

   IMPDP> 启动"SYS"."TSPITR_IMP_cwCb_oECq": 

   IMPDP> 处理对象类型 TABLE_EXPORT/TABLE/TABLE

   IMPDP> 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA

   IMPDP>. . 导入了 "LIHM"."T_NEW"                              5.085 KB       3 行

   IMPDP> 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

   IMPDP> 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/MARKER

   IMPDP> 作业 "SYS"."TSPITR_IMP_cwCb_oECq" 已于 星期四 8月 8 13:47:32 2013 elapsed 0 00:00:07 成功完成

导入完毕

删除自动实例

自动实例已删除

已删除辅助实例文件 /tmp/oratmp/ORCL/datafile/o1_mf_temp_906d3yr3_.tmp

已删除辅助实例文件/tmp/oratmp/CWCB_PITR_ORCL/onlinelog/o1_mf_3_906d52rv_.log

已删除辅助实例文件 /tmp/oratmp/CWCB_PITR_ORCL/onlinelog/o1_mf_2_906d52dp_.log

已删除辅助实例文件/tmp/oratmp/CWCB_PITR_ORCL/onlinelog/o1_mf_1_906d524g_.log

已删除辅助实例文件/tmp/oratmp/CWCB_PITR_ORCL/datafile/o1_mf_users_906d4zog_.dbf

已删除辅助实例文件/tmp/oratmp/ORCL/datafile/o1_mf_sysaux_906d2qt7_.dbf

已删除辅助实例文件 /tmp/oratmp/ORCL/datafile/o1_mf_undotbs1_906d2qtl_.dbf

已删除辅助实例文件/tmp/oratmp/ORCL/datafile/o1_mf_system_906d2qsn_.dbf

已删除辅助实例文件 /tmp/oratmp/ORCL/controlfile/o1_mf_906d2jxj_.ctl

已删除辅助实例文件 tspitr_cwCb_54024.dmp

完成 recover 于 08-8月 -13

RMAN>

 

检查恢复后的表:

SQL> select * from t_new;

 

MSG

----------------------------------------

2013-08-08 13:36:54

2013-08-08 13:36:56

2013-08-08 13:36:57

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值