数据库中表,出现了坏块。对于这个问题,在网上早就有了各种各样的讨论和解霭旆ǎ?衷谧芙崛缦拢?韵M?诠丶?笨棠苡玫蒙希?br /> 一、 数据表出现坏块,设置10231事件来进行EXP,然后在IMP的方法
对于这种情况来说,如果没有热备份,或者时间匆忙,来不及从备份中恢复,那么我们只能丢失一部分数据,先尽可能的修复在说了。 一般情况下,出现数据坏块,并不影响数据库的启动(非system 数据库文件损坏),但是一旦我们使用到了相关数据,就会报出类似如下信息的错误:ORA-01578: ORACLE 数据块损坏(文件号4,块号35),我们需要用以下的sql来进行查询,以确保损坏的仅仅是我们数据库中的表的数据:
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id =4 AND 35 between block_id AND block_id + blocks - 1 (注意:如果是TEMP坏,则没有返回值)
这个时候,用dbv来检查文件号为4的数据文件,将会报错误信息;
由于出现坏块,EXP 在这个时候是不能进行的,我们必须设置如下事件,以让数据库在进行FTS的时候绕过数据坏块:
ALTER SYTEM set EVENTS = '100231 trace name context forever, level 10';
再次进行EXP,就可以导出数据了。
二、 用dbms_repair包
exec DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS');
exec DBMS_REPAIR.ADMIN_TABLES('ORPHAN_TABLE',2,1,'USERS');
exec dbms_repair.check_object(schema_name => 'SYSTEM',object_name => 'TEST',corrupt_count => cc);
select *from repair_table;
exec dbms_repair.fix_corrupt_blocks(schema_name => 'SYSTEM',object_name => 'TEST',fix_count => cc);
exec dbms_repair.skip_corrupt_blocks(schema_name => 'SYSTEM',object_name => 'TEST',flags => 1);
exec dbms_repair.dump_orphan_keys(schema_name => 'SYSTEM',object_name => 'I_TEST',object_type => 2,
repair_table_name => 'REPAIR_TABLE',orphan_table_name => 'ORPHAN_TABLE',key_count => CC);
exec dbms_repair.rebuild_freelists(schema_name => 'SYSTEM',object_name => 'TEST');
三、 用 9i 的特性:blockrecover 来修复坏块
RMAN > RUN {
BLOCKRECOVER DATAFILE 2 BLOCK 12, 13 DATAFILE 7 BLOCK 5, 98, 99 DATAFILE 9 BLOCK 19;
}
RMAN > RUN {
BLOCKRECOVER DATAFILE 3 BLOCK 2,3,4,5
TABLESPACE sales DBA 4194405, 4194409, 4194412
FROM DATAFILECOPY
}
Rman > RUN {
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404, 4194405 RESTORE UNTIL TIME 'SYSDATE-2';
}
Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}
RMAN> blockrecover datafile 2 block 14 from backupset;
四、 用BBED 来修复坏块
五、 数据块损坏后,如何创建索引?
对于一般的索引,我们可以删除掉该索引,然后重建;如果该索引为主键,我们只能先disable该主键,disable后,相关索引也自然没有了,然后我们再重建索引
六、 模拟数据坏块
我们一般用UE、winhex等软件可以来模拟坏块的情况。这些都是windows的情况,在unix的情况下,我们可以通过以下方法来处理: a. dd命令 b. orapatch 命令:
$orapatch open tools001.dbf write
patch>set hex --要用十六进制
patch>display 177 --orapatch以512字节为工作模式,假定想破坏第11个block即为:8k/512*11+1(file header)
patch>find 00400003 --选一个要编辑的点
patch>modify 00400002 --破坏
patch>exit
阅读(337) | 评论(0) | 转发(0) |