学习oracle技术,每天学一点,每天进步一点

ORA-01578坏块解决方法

上一篇 / 下一篇  2008-04-28 14:24:32 / 个人分类:数据库维护

一.  出问题时的情景

我在自己测试数据库上给大表tb_table导完数据后,建立索引时,出现以下错误

ORA-01578: ORACLE data block corrupted (file # 7, block # 28969)ITPUB个人空间#d t,{~"i1j
ORA-01110: data file 7: 'D:\ORACLE\ORADATA\PAUL\GAME_LARGE.DBF'

查看alert.log日志时有以下错误

  Corrupt block relative dba: 0x01c07129 (file 7, block 28969)

Bad check value found during buffer read

Data in bad block -

  type: 6 format: 2 rdba: 0x01c07129

  last change scn: 0x0000.00035361 seq: 0x1 flg: 0x04

  consistency value in tail: 0x53610601

  check value in block header: 0x302a, computed block checksum: 0x8

  spare1: 0x0, spare2: 0x0, spare3: 0x0

二.   解决方法

1.执行以下语句看哪个段坏了

 selectsegment_type,owner||'.'||segment_nameITPUB个人空间$VW1[~7@t
fromdba_extents
T~wF[%?0x0where
7= file_idand28969betweenblock_idandblock_id+blocks -1

   segment_type            owner.segment_name

TABLE PARTITION     PAUL.TB_CASHFLOW_LOG

2.使用诊断事件

如果损失的是数据,ok
wZCG4}._0
我们可以设置内部事件,使exp跳过这些损坏的block

 SQL> ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level10’;

取消内部事件设置

 如果你在初始化参数中设置的,注视之ITPUB个人空间;C c'GFsg
如果在命令行设置的ITPUB个人空间5?5djwFQ+z3i6V o}6B
alter system set events='10231 trace name context off';

3、创建一个临时表tb_cashflow_log_tmp的表中除坏块的数据都检索出来
$a e6g x&D$P&|XW0ITPUB个人空间x+U%t~ Z7xg
SQL>CREATE TABLE tb_cashflow_log_tmp as select * from tb_cashflow_log;ITPUB个人空间*X4n+M+AF&qpK
ITPUB个人空间1LBnWz2w Z"i
4
更名原表
x T Z"D&h+WXr6r] y0ITPUB个人空间9fP/R,Kd7E c9mQ4Z
SQL>alter table tb_cashflow_log rename to tb_cashflow_log _bak;
%nY ?6u`1t0]U0ITPUB个人空间(O*Oz2m-Xq(xj
SQL>alter table tb_cashflow_log _tmp to tb_cashflow_log;
e"wUqW JU#B0
d.pZv4Z a05
、在tb_cashflow_log上重新创建索引、约束、授权、trigger等对象ITPUB个人空间4SL(l;Zy*OF

] d5U9FZ'eoh06
利用表之间的业务关系,把坏块中的数据补足。

 

然后用DBV来检验坏块:ITPUB个人空间dS9`'p^
ITPUB个人空间H*mw3@7HQ W
E:\Oracle\oradata\paul>dbv file=block.dbf blocksize=8192
5YM q4y&S!@;Z0

1. exp正常吗,exp的数据imp到一个临时表中,看看数据的记录数是否正确啊.
,e focQ(j0ITPUB个人空间A-NhQ ~5I|
2.
如果正常,直接删除目前的数据表,在利用测试数据重建这个表就好了.
z$Mrc"^0ITPUB个人空间^O8^i+be'}oPu2C
3.
如果不正常.使用10231trace event,再使用create table as select重建对应的表之后,  rename当前表,再将对应的数据块, dump出来,自己构建相应的数据内容吧^_^.

 

二、事后分析产生这种问题的原因
7?i Q F.^ f\0ITPUB个人空间v*ax\q~] q Q6w
1
 十之八九这个Oracle数据库server打开了异步I/O(async io)或增加了写进程。
%cjQ"\VEw0^0
Mr:X'@V02
 硬件的I/O出现了错误。
.wtg9B+H7n0
X/wW$JY,IW/W-G03
 操作系统的I/O或缓存出现我问题,比如操作系统对于异步I/O的补丁没有打。
7~?O:mMF0
~!QD9}Q9tN\H5Nq04
 手动的修改了数据文件中的数据,我模拟这个错误用的便是这种方式。

 

四、如何尽量减少问题及问题的损失呢
!e`/xU K Jt0ITPUB个人空间vw)Wf]6~
 
分析了产生问题的原因,我认为可以采取以下几个措施ITPUB个人空间d_[-Wi4E1F

8flMkw-P6gQ01
 在为提高性能为操作系统打开异步I/O时,一定要与oracle及操作系统技术支持联系把操作系统与异步I/O相关的补丁要打全。ITPUB个人空间 xu:U)u:LT!uR5H[
ITPUB个人空间e~[{$U \
2
 制定一个良好的备份恢复策略,最好有表的exp备份ITPUB个人空间8f4O:j7B%Kl6u&QPR

_+b0\R(hP ts9~.`$H03
 要及时的检查硬件的状态,及时更换驱动器部件

 

这次测试数据库又出现系统表空间有坏块,目前情况下只能通过重建库来解决了,重新导入备份的数据

要是索引块坏的话还是比较好处理,重建索引即可

所以最好保证不出问题,要有良好的备份.

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 20466
  • 日志数: 291
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-10-04

RSS订阅

Open Toolbar