Oracle块损坏导致表无法读取处理

如果数据库有坏块时,我们可能会遇到select某张表出现ORA-01578的错误。如果损坏的块只是普通的数据文件,对于OLAP的数据库,影响不是很大,最多就是丟几个块的数据,不至于灾难性的问题。那么处理这种故障的思路是什么样的了?

1)找到这个坏块的ID

.....
ORA-01578: ORACLE 数据块损坏(文件号5,块号67) --这个报错已经批名了文件名和块号
.....

---我们也可以使用的dbv工具要查找dbv file=test.dbf blocksize=8192   
---file为报错提示的数据文件名,blocksize根据实际填写

2)找到这个坏块所处的段

SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 4
AND block_id<=35 
AND block_id + blocks>35

3)导到这个段的数据,当然坏块上的数据就不能导出了(如果直接导数据,导数据时ORACLE也是得扫描该表的块,所以也会报错,所以导不出)

ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10'; ---该命令可以让select时跳过坏块
exp username/password@sid file=test.dmp tables=test log=test.log

4)新建一张表,把数据再导回去

create table test2 as select * from test where 1=2;
imp username/password@sid file=test.dmp log=test.log

5)DROP之前的表

drop table test;

以上就是整个恢复过程。

0

热门评论