How to recover data with DUL after datafile offline

系统情况如下:
1. Oracle版本是10.2.0.3,操作系统是HP-UX PA RISC 64
2. 数据文件存储在裸设备上
3. 需要恢复的表是分区表
4. 在调整存储硬件的时候没有关闭数据库,由于某些不可预知的故障导致某些用户表空间的数据文件write error,然后自动offline了
5. 数据库确实是归档模式,但是有一个每小时删除一次归档的crontab,删除了重新online数据文件需要的所有归档
6. 保留了之前建表时的create脚本

恢复过程如下:
1. DUL使用的init.dul内容:

CONTROL_FILE = control.dul
DB_BLOCK_SIZE = 16384

2. DUL使用的control.dul文件内容

0 1 /somepath/rsystem_01_8g blocks 524161
22 128 /somepath/r_data07_01_32g blocks 2096641
22 134 /somepath/r_data07_02_32g blocks 2096641 
22 141 /somepath/r_data07_03_32g blocks 2096641
22 147 /somepath/r_data07_04_32g blocks 2096641
22 153 /somepath/r_data07_05_32g blocks 2096641
22 159 /somepath/r_data07_06_32g blocks 2096641
22 165 /somepath/r_data07_07_32g blocks 2096641
22 171 /somepath/r_data07_08_32g blocks 2096641
22 177 /somepath/r_data07_09_32g blocks 2096641
22 183 /somepath/r_data07_10_32g blocks 2096641

在HP-UX PA RISC中,虽然数据文件是存储在裸设备中的,但是仍然不需要设置需要跳过的字节,跟AIX中DUL相比较,缺少了第4位的4096。

3. 登录DUL

DUL> bootstrap;
DUL> unload table user_name.table_name;

由于system表空间正常,数据字典都存在,因此unload table的过程很简单,并且对于分区表(复合分区表)DUL也是完全胜任的,只需要指定table name,就会自动unload出该表的所有分区以及子分区的数据。

这次DUL大概花了4个小时,unload出120G左右的数据。数据库字符集为ZHS16GBK,字段内容包含中文内容,DUL可以unload出正确的字符。

4. 重新创建表结构,将DUL卸载出的数据再sqlldr到表中。
此步操作在处理位于offline表空间中的表分区时碰到了ORA-14117错误,详细参看How to resolve ORA-14117: partition resides in offlined tablespace文章。

19 comments to How to recover data with DUL after datafile offline

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">