你试试看 当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息: 
ORA-01578: ORACLE data block corrupted (file # 7, block # <BLOCK> 
ORA-01110: data file <AFN>: '/oracle1/oradata/V920/oradata/V816/users01.dbf' 其中,<AFN>代表坏块所在数据文件的绝对文件号,<BLOCK>代表坏块是数据文件上的第几个数据块 
出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。 
1.确定发生坏块的数据库对象 
SELECT tablespace_name, 
segment_type, 
owner, 
segment_name 
FROM  dba_extents 
WHERE  file_id = <AFN> 
AND <BLOCK> between block_id AND block_id+blocks-1; 
2.决定修复方法 
如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建; 
如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建; 
如果有数据库的备份,则恢复数据库的方法来进行修复; 
如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据坏上的记录取出来,然后对这个表进行重建。 
3.用Oracle提供的DBMS_REPAIR包标记出坏块 
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('<schema>','<tablename>'); 
4.使用Create table as select命令将表中其它块上的记录保存到另一张表上 
create table corrupt_table_bak  
as 
 select * from corrupt_table; 
5.用DROP TABLE命令删除有坏块的表 
drop table corrupt_table; 
6.用alter table rename命令恢复原来的表 
alter table corrupt_table_bak 
rename to corrupt_table; 
7.如果表上存在索引,则要重建表上的索引

解决方案 »

  1.   

    是回滚段中坏块造成的,你可以试试下面的办法。 
    1、将数据关闭 
    >     svrmgrl >Shutdown abort 
    >   
    >  2、修改初始化参数文件 
    >     $ vi  $ORACLE_HOME/dbs/init< sid >.ora 
    >     添加以下参数 
    >      rollback_segments=(system) 
    >     _corrupted_rollback_segments=(r01,r02,r03,r04) 
    >     _allow_resetlogs_corruption=ture  
    >   
    >  3、重新装载数据库 
    >  svrmgrl >Startup mount 
    >  
    >  4、从数据库的控制文件中将回滚段表空间rbs的数据文件离线并去掉。  
    >  
    >    svrmgrl >alter database datafile 
    >   ‘##/##/rbs01.dbf’ offline drop; 
    >    ---- 对数据库进行恢复。 
    >    svrmgrl >recover database using backup controlfile; 
    >    ---- 此时屏幕上可能会出现:  
    >  
    >    ORA_00280 Change #### for thread# is in sequence# 
    >    specify log:[< RET > for suggested|AUTO|from logsource|cancel] 
    >    输入 cancel(不要输入其他命令) 
    >  
    >    svrmgrl >alter database open resetlogs; 
    >   
    >  5、 重建新的回滚段  
    >  
    >    ---- 将旧回滚段及回滚表空间删除。  
    >    svrmgrl >alter rollback_segment r01 offline drop; 
    >    svrmgrl >alter rollback_segment r02 offline drop; 
    >    svrmgrl >alter rollback_segment r03 offline drop; 
    >    svrmgrl >alter rollback_segment r04 offline drop; 
    >    svrmgrl >drop tablespace rbs including contents; 
    >    ---- 重建新的回滚表空间及回滚段。  
    >  svrmgrl >connect internal 
    >  svrmgrl >create rollback segment ro tablespace system; 
    >  svrmgrl >alter rollback segment ro online; 
    >  svrmgrl >create tablespace rbs datafile  
    > ‘##/##/rbs01.dbf’ size ##k; 
    >  svrmgrl >create rollback segment r01 tablespace rbs; 
    >  svrmgrl >create rollback segment r02 tablespace rbs; 
    >  svrmgrl >create rollback segment r03 tablespace rbs; 
    >  svrmgrl >create rollback segment r04 tablespace rbs; 
    >  svrmgrl >alter rollback segment r01 online; 
    >  svrmgrl >alter rollback segment r02 online; 
    >  svrmgrl >alter rollback segment r03 online; 
    >  svrmgrl >alter rollback segment r04 online; 
    >  
    >  
    >  svrmgrl >Shutdown abort 
    >  $  vi  $ORACLE_HOME/dbs/init< sid >.ora 
    >     rollback_segments=(r01,r02,r03,r04) 
    >     将参数_corrupted_rollback_segment 
    >           _allow_resetlogs_corruption=true去掉 
    >  svrmgrl >Startup normal 
    > 如果有其他问题或错误提示请通知我!
      

  2.   

    file #4  真的是 system tablespace 中的?
    如果是那以前有system tablespace的备份没有?system不同于其他的表空间吧
      

  3.   

    LGQDUCKY(飘):你发的方案我在网上也看过。其中第一个方案中:
    1.确定发生坏块的数据库对象 
    SELECT tablespace_name, 
    segment_type, 
    owner, 
    segment_name 
    FROM  dba_extents 
    WHERE  file_id = <AFN> 
    AND <BLOCK> between block_id AND block_id+blocks-1; 
    无法查询到错误的数据块。
    我直接按出错块块条件查询:
    SELECT * FROM  dba_extents 
    WHERE  file_id = 4
    AND block_id<1301+blcoks
    没有任何数据
    然后查询
    SELECT * FROM  dba_extents 
    WHERE  file_id = 4
    AND block_id>=1301+blcoks
    发现最小的块号为1310所以不知道坏块是在哪个对象上。
      

  4.   

    to :l2g32003(T2-X) 
    从报错信息来看ORA-01110:data file 1: 'O:\DB\DBFILE\SYSTEM.ORA'
    是系统表空间的错误,而且我查找损坏的块号也找不到
    所以我怀疑是系统表空间损坏。
    如果不用exp/imp的方法,有没有其他的方法修复