D公司的应用开发人员在ASM存储环境下,在没有任何备份的情况下DROP了系统中一张核心应用表,此时第一时间采用PRM可以恢复该DROP掉数据表的绝大部分数据。10g以后提供了 recyclebin回收站特性,可以首先通过查询DBA_RECYCLEBINS视图来确定被DROP掉的表是否在回收站中,如果在则优先通过回收站flashback to before drop,如果回收站中也没有了,则第一时间使用PRM恢复。
恢复简要流程如下:
- 首先将被DROP掉的数据表所在的表空间OFFLINE
- 通过查询数据字典或者LOGMINER找到被DROP掉数据表的DATA_OBJECT_ID,如果此步骤中得不到这个DATA_OBJECT_ID,则需要在NON-DICT非字典模式下
- 启动PRM,进入NON-DICT非字典模式,并加入被DROP掉数据表所在的表空间的所有数据文件,之后SCAN DATABASE+SCAN TABLE from Extent MAP
- 通过DATA_OBJECT_ID定位到展开对象树形图中对应的数据表,采用DataBridge模式插回到源数据库中
SQL> select count(*) from "MACLEAN"."TORDERDETAIL_HIS"; COUNT(*) ---------- 984359 SQL> SQL> create table maclean.TORDERDETAIL_HIS1 as select * from maclean.TORDERDETAIL_HIS; Table created. SQL> drop table maclean.TORDERDETAIL_HIS; Table dropped.
可以通过logminer或者《恢复场景9》中提供的方法得到大致的DATA_OBJECT_ID,使用LOGMINER则大致的脚本如下:
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '/oracle/logs/log1.f', OPTIONS => DBMS_LOGMNR.NEW); EXECUTE DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '/oracle/logs/log2.f', OPTIONS => DBMS_LOGMNR.ADDFILE); Execute DBMS_LOGMNR.START_LOGMNR(DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.COMMITTED_DATA_ONLY); SELECT * FROM V$LOGMNR_CONTENTS ; EXECUTE DBMS_LOGMNR.END_LOGMNR;
即便这里得不到DATA_OBJECT_ID,在数据表不多的情况下还是可以通过人工识别数据来定位我们需要恢复的数据表。
首先将被DROP掉的数据表所在的表空间OFFLINE
SQL> select tablespace_name from dba_segments where segment_name='TPAYMENT'; TABLESPACE_NAME ------------------------------ USERS SQL> select file_name from dba_data_files where tablespace_name='USERS'; FILE_NAME ---------------------------------------------------------------- +DATA1/parnassus/datafile/users.263.843694795 SQL> alter tablespace users offline; Tablespace altered.
启动PRM到NON-DICT模式,并加入对应的数据文件选择SCAN DATABASE+SCAN TABLE From Extents:
由于是在非字典模式下所有需要输入必要的字符集信息:
选择被DROP掉的表所在的数据文件即可,多余的数据文件可不选择,并点击SCAN:
点中生成的数据库名,并右键选择scan tables from extents:
通过人工识别发现DATA_OBJECT_ID=82641的数据对应于被DROP掉的TORDERDETAIL_HIS表,通过DataBridge技术将其传输回源库别的表空间中。