Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11681173
  • 博文数量: 8065
  • 博客积分: 10002
  • 博客等级: 中将
  • 技术积分: 96708
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 17:06
文章分类

全部博文(8065)

文章存档

2008年(8065)

分类: 服务器与存储

2008-07-16 15:56:55

数据库中表,出现了坏块。对于这个问题,在网上早就有了各种各样的讨论和解霭旆ǎ?衷谧芙崛缦拢?韵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
阅读(343) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~