create table t100 as select object_id,object_name from dba_objects where object_id < 2000;
select dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid) blk#,dbms_rowid.rowid_row_number(rowid) row#,object_id from t100;
FNO BLK# ROW# OBJECT_ID
---------- ---------- ---------- ----------
7 426 25 666
7 426 26 667
7 426 27 668
7 426 28 669
7 426 29 670
1996 rows selected.
--破坏7号文件的411 block
dd if=/dev/zero of=/oradata/ORCL/users01.dbf bs=8192 seek=426 count=1 conv=notrunc
SQL> startup force
SQL> select count(1) from scott.t100;
select count(1) from scott.t100
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 7, block # 426)
ORA-01110: data file 7: '/oradata/ORCL/users01.dbf'
-- 1966
--创建个新表后删除,把这个空block复制过去
SQL> create table tmp100 as select *from dba_segments where rownum <100;
Table created.
SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments where owner='SCOTT' and segment_name='TMP100';
HEADER_FILE HEADER_BLOCK
----------- ------------
7 434
SQL> delete from tmp100;
99 rows deleted.
SQL> commit;
Commit complete.
SQL> alter system checkpoint;
System altered.
SQL>
select object_name,object_id from dba_objects where owner='SCOTT' and object_name in ('TMP100','T100')
OBJECT_NAME OBJECT_ID
-------------------- ----------
T100 73441
TMP100 73446
--copy 7,435 to 7,426
copy dba 7,435 to dba 7,426
sum apply
--copy 的block需要修改2个位置:dba地址和object_id
set dba 7,426
p ktbbh
ub4 ktbbhsg1 @24 0x00011ee6 --这里是object_id
ub4 ktbbhod1 @24 0x00011ee6
--找个本对象的相邻的block 查看 object_id 并复制
d /v dba 7,425 offset 24 count 10
-- e11e0100 2f1a2900 0080
d /v dba 7,426 offset 24 count 10
-- e61e0100 04a92a00 0080
--修改 7,426 的对象id
modify /x e1 dba 7,426 offset 24
sum apply
--修改7,426的rdba地址
BBED> set dba 7,426
DBA 0x01c001aa (29360554 7,426)
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub2 wrp2_kcbh @2 0x0000
ub4 rdba_kcbh @4 0x01c001b3 ,需要修改成 0x01c001aa
d /v offset 4 count 10
--b301c001 修改成 aa01c001
modify /x aa01 offset 4
sum apply
--再次访问成功
SQL> alter system flush buffer_cache;
System altered.
SQL> select count(1)from t100;
COUNT(1)
----------
1966
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




