在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