某系统由于存储损坏导致一个大对象LOB的LOB INDEX存在坏块corruption,且该系统无任何有效之备份。此时若要恢复对BLOB/CLOB中的数据则无法使用常规的方法,这里可以使用PRM-DUL 工具(http://www.parnassusdata.com/)来恢复其中数据。
场景重现为如下:
select * from BASE_CUSTOMERS_PHOTO where outid='XXXXXX' select count(*) from BASE_CUSTOMERS_PHOTO 28050
此时对LOB INDEX 做彻底破坏
SQL> select INDEX_NAME from dba_lobs where table_name='BASE_CUSTOMERS_PHOTO'; INDEX_NAME ------------------------------ SYS_IL0000094755C00003$$ SQL> select header_file,header_block from dba_segments where segment_name='SYS_IL0000094755C00003$$'; HEADER_FILE HEADER_BLOCK ----------- ------------ 6 879546 [oracle@ocp ~]$ rman target / Recovery Manager: Release 11.2.0.4.0 - Production on Wed Jul 13 15:14:13 2016 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: GBK2 (DBID=717109662) RMAN> recover datafile 6 block 879546 clear; Starting recover at 13-JUL-16 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=150 device type=DISK Finished recover at 13-JUL-16 [oracle@ocp ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Jul 13 15:14:40 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> alter system flush buffer_cache; System altered. SQL> select data_object_id from dba_objects where object_name='SYS_IL0000094755C00003$$'; DATA_OBJECT_ID -------------- 94757 SQL> desc ind$ Name Null? Type ----------------------------------------- -------- ---------------------------- OBJ# NOT NULL NUMBER DATAOBJ# NUMBER TS# NOT NULL NUMBER FILE# NOT NULL NUMBER BLOCK# NOT NULL NUMBER BO# NOT NULL NUMBER INDMETHOD# NOT NULL NUMBER COLS NOT NULL NUMBER PCTFREE$ NOT NULL NUMBER INITRANS NOT NULL NUMBER MAXTRANS NOT NULL NUMBER PCTTHRES$ NUMBER TYPE# NOT NULL NUMBER FLAGS NOT NULL NUMBER PROPERTY NOT NULL NUMBER BLEVEL NUMBER LEAFCNT NUMBER DISTKEY NUMBER LBLKKEY NUMBER DBLKKEY NUMBER CLUFAC NUMBER ANALYZETIME DATE SAMPLESIZE NUMBER ROWCNT NUMBER INTCOLS NOT NULL NUMBER DEGREE NUMBER INSTANCES NUMBER TRUNCCNT NUMBER SPARE1 NUMBER SPARE2 NUMBER SPARE3 NUMBER SPARE4 VARCHAR2(1000) SPARE5 VARCHAR2(1000) SPARE6 DATE SQL> select flags from ind$ where dataobj#=94757; FLAGS ---------- 0 SQL> update ind$ set flags=1 where dataobj#=94757; 1 row updated. SQL> commit; Commit complete. SQL> select status from dba_indexes where index_name='SYS_IL0000094755C00003$$'; STATUS -------- UNUSABLE SQL> alter system flush shared_pool; System altered. SQL> alter system flush buffer_cache; System altered.
此时启动PRM-DUL ,字典模式=》选择LOB所在表,选择Data Bridge,选择Base on LOB SCAN
这里使用based on lob scan的含义是基于PRM扫描LOb数据的信息去恢复数据,而不依赖于LOB INDEX的索引结构信息。
Leave a Reply