ORACLE坏块(ORA-01578)处理方法

ORACLE 的坏块即 ORA-01578 错,同时还可能伴随 ORA-01110 错,这种错误对于初学者或是那些没有实践经验的 dba 来说无疑是很棘手的。我当初就深受其害,写下这篇文章则是希望对大家有所帮助。

一、 出问题时的情景

1、 我的一个计费的入库的进程停掉,报的便是 ORA-01578 错,对应用相关的表 tg_bill03 做 SQL>select from tg_cdr03 where rownum<10; 这样是可以的,但做 SQL>select count(*) from tg_bill03; 时则报 ORA-01578 错。

2、 检查 alter

 1<sid>.log  中看到一几条报错信息: 
 2
 3Errors in file /oracle816/app/admin/billing/udump/ora_7281_billing.trc: 
 4
 5ORA-01578: ORACLE data block corrupted (file # 126, block # 88490) 
 6
 7ORA-01110: data file 126: '/dev/vgjf7/rdata471' 
 8
 9二、  事后分析产生这种问题的原因 
10
111、  十之八九这个  Oracle  的数据库  server  打开了异步  I/O(async io)  或增加了写进程。 
12
132、  硬件的  I/O  出现了错误。 
14
153、  操作系统的  I/O  或缓存出现我问题,比如操作系统对于异步  I/O  的补丁没有打。 
16
174、  手动的修改了数据文件中的数据,我模拟这个错误用的便是这种方式。 
18
19三、  解决方法 
20
21这种问题的解决方法是很多的,如果你用的是归档方式,则可以基于时间点恢复来解决。不过这里介绍一种比较方便的解决方式,因为我的库没有开归档。  Metaline  关于  ORA-01578  的文字也很多,不过我看过后总觉得都不那么实用,不能解决实际的问题。 
22
231、  解决这种问题的第一步是首先你要确定是什么段、哪个段坏了,是索引还是表? 
24
25A、  打开  alter<sid>.log  ,找到  ORA-01578  的报错信息,并记录下  file#  及  block  的值,我这里是  126  和  88490  。 
26
27B、  执行以下语句看哪个段坏了 
28
29SQL&gt;Select * from dba_extents 
30
312  where  file_id=<f>
32
333  and <b> between block_id and block_id+blocks-1; 
34
35这里的  F  指的是  file#,B  指的是  block# 
36
37我的显示结果指出是  tg_bill03  出现了坏块。 
38
392  、如果确定下来坏的是索引段,这时你就可以轻舒一口气了,只要把这个索相删除然后重建一下就可以了,如果出现坏的是表段,则应往下走了。 
40
413、  记录下这个表的建表语句 
42
43为我方便,建议使用  PL/SQL Developer  来完成,如果你没有可以在  http://www.allroundautomations.com/plsqldev.html  去下载一个,操作步骤是这样的。 
44
45A、  以表的  owner  用  pl/sql developer  连入  oracle 
46
47B、  在左面的树状栏中找到这个表  tg_bill03,  右击该表  -&gt;view-&gt;View SQL,  记录下  sql  ,以备以下步骤中重建索引。 
48
494、  实际处理了,以我的那个表为例 
50
51A、  以  tg_bill03  的  owner  连入  oracle 
52
53B、  使用诊断事件  10231 
54
55SQL&gt; ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10’; 
56
57C  、创建一个临时表  tg_bill_tmp  的表中除坏块的数据都检索出来 
58
59SQL&gt;CREATE TABLE tg_bill03_tmp as select * from tg_bill03; 
60
61C、  更名原表,并把  tg_bill03_tmp  为  tg_bill03 
62
63SQL&gt;alter table tg_bill03 rename to tg_bill03_bak; 
64
65SQL&gt;alter table tg_bill03_tmp to tg_bill03; 
66
67D、  在  tg_bill03  上重新创建索引、约束、授权、  trigger  等对象 
68
69E、  利用表之间的业务关系,把坏块中的数据补足。 
70
71四、  如何尽量减少问题及问题的损失呢 
72
73分析了产生问题的原因,我认为可以采取以下几个措施 
74
751、  在为提高性能为操作系统打开异步  I/O  时,一定要与  oracle  及操作系统技术支持联系把操作系统与异步  I/O  相关的补丁要打全。 
76
772、  制定一个良好的备份恢复策略,最好有表的  exp  备份 
78
793、  要及时的检查硬件的状态,及时更换驱动器部件。 
80
81结篇:其实坏块涉及的内容很多的,如果坏块发生的回滚段表空间、数据字典  (system  表空间  )  或联机日志,这些处理都是特难的,需要与  oracle  的  supporter  联系。不过这些方面的坏的机率很少很少的,在以后的文章中我也会做介绍。</b></f></sid></sid>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus