当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.如果表上存在索引,则要重建表上的索引作者: digitalunix 时间: 2003-09-10 12:50 标题: 如何查找损坏块,急!谢谢 system表空间坏,数据库都无法启动了,还是从备份中恢复吧。作者: liaolwj 时间: 2003-09-10 13:20 标题: 如何查找损坏块,急!谢谢 现在是数据库OPEN时都不允许,数据又没有备份,所以说除了重建,还能有什么办法吗?作者: liontiger 时间: 2003-09-10 14:17 标题: 如何查找损坏块,急!谢谢 把alert<SID>;贴出来作者: liaolwj 时间: 2003-09-10 14:41 标题: 如何查找损坏块,急!谢谢 其中一部分
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1, block # 12051)
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'
***
Corrupt block relative dba: 0x00403b32 (file 1, block 15154)
Bad header found during buffer read
Data in bad block -
type: 48 format: 49 rdba: 0x31303700
last change scn: 0x076c.61730003 seq: 0x0 flg: 0x64
consistency value in tail: 0x31303000
check value in block header: 0x7165, computed block checksum: 0x27cd
spare1: 0x33, spare2: 0x3, spare3: 0x6575
***
Reread of rdba: 0x00403b32 (file 1, block 15154) found same corrupted data
Wed Sep 10 08:53:44 2003
SMON: disabling cache recovery
Wed Sep 10 08:53:45 2003
ORA-604 signalled during: alter database open...
Wed Sep 10 08:53:45 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'
Wed Sep 10 08:53:46 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'
Wed Sep 10 08:53:47 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'
Wed Sep 10 08:53:48 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'作者: liaolwj 时间: 2003-09-10 16:50 标题: 如何查找损坏块,急!谢谢 各位对该问题还有没有更好的解决办法!作者: deepblue 时间: 2003-09-12 17:32
提示: 作者被禁止或删除 内容自动屏蔽作者: 白雪松 时间: 2003-09-16 10:04 标题: 如何查找损坏块,急!谢谢 你说的之中情况,多数是回滚段中坏块造成的,你可以试试下面的办法。