暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 19c :bbed 用空块 解决坏块问题

原创 四九年入国军 2025-06-05
101
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论