系统表空间的数据文件损坏怎么办

[复制链接]
查看11 | 回复3 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
在查找一个系统表的时候出现错误
ORA-01578: ORACLE 数据块损坏(文件号1,块号38798)
ORA-01110: 数据文件 1: 'D:\ORACLE\ORADATA\ZY4Q\SYSTEM01.DBF'
不知道该怎么处理
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
ORACLE坏块(ORA-01578)处理方法

hrb_qiuyb(原作)

ORACLE 的坏块即 ORA-01578 错,同时还可能伴随 ORA-01110 错,这种错误对于初学者或是那些没有实践经验的 dba 来说无疑是很棘手的。我当初就深受其害,写下这篇文章则是希望对大家有所帮助。
一、 出问题时的情景
1、 我的一个计费的入库的进程停掉,报的便是 ORA-01578 错,对应用相关的表 tg_bill03 做 SQL>select from tg_cdr03 where rownumselect count(*) from tg_bill03; 时则报 ORA-01578 错。
2、 检查 alter.log 中看到一几条报错信息:
Errors in file /oracle816/app/admin/billing/udump/ora_7281_billing.trc:
ORA-01578: ORACLE data block corrupted (file # 126, block # 88490)
ORA-01110: data file 126: '/dev/vgjf7/rdata471'
二、 事后分析产生这种问题的原因
1、 十之八九这个 Oracle 的数据库 server 打开了异步 I/O(async io) 或增加了写进程。
2、 硬件的 I/O 出现了错误。
3、 操作系统的 I/O 或缓存出现我问题,比如操作系统对于异步 I/O 的补丁没有打。
4、 手动的修改了数据文件中的数据,我模拟这个错误用的便是这种方式。
三、 解决方法
这种问题的解决方法是很多的,如果你用的是归档方式,则可以基于时间点恢复来解决。不过这里介绍一种比较方便的解决方式,因为我的库没有开归档。 Metaline 关于 ORA-01578 的文字也很多,不过我看过后总觉得都不那么实用,不能解决实际的问题。
1、 解决这种问题的第一步是首先你要确定是什么段、哪个段坏了,是索引还是表?
A、 打开 alter.log ,找到 ORA-01578 的报错信息,并记录下 file# 及 block 的值,我这里是 126 和 88490 。
B、 执行以下语句看哪个段坏了
SQL>Select * from dba_extents
2 where file_id=
3 and [B] between block_id and block_id+blocks-1;
这里的 F 指的是 file#,B 指的是 block#
我的显示结果指出是 tg_bill03 出现了坏块。
2 、如果确定下来坏的是索引段,这时你就可以轻舒一口气了,只要把这个索相删除然后重建一下就可以了,如果出现坏的是表段,则应往下走了。
3、 记录下这个表的建表语句
为我方便,建议使用 PL/SQL Developer 来完成,如果你没有可以在 http://www.allroundautomations.com/plsqldev.html 去下载一个,操作步骤是这样的。
A、 以表的 owner 用 pl/sql developer 连入 oracle
B、 在左面的树状栏中找到这个表 tg_bill03, 右击该表 ->view->View SQL, 记录下 sql ,以备以下步骤中重建索引。
4、 实际处理了,以我的那个表为例
A、 以 tg_bill03 的 owner 连入 oracle
B、 使用诊断事件 10231
SQL> ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10';
C 、创建一个临时表 tg_bill_tmp 的表中除坏块的数据都检索出来
SQL>CREATE TABLE tg_bill03_tmp as select * from tg_bill03;
C、 更名原表,并把 tg_bill03_tmp 为 tg_bill03
SQL>alter table tg_bill03 rename to tg_bill03_bak;
SQL>alter table tg_bill03_tmp to tg_bill03;
D、 在 tg_bill03 上重新创建索引、约束、授权、 trigger 等对象
E、 利用表之间的业务关系,把坏块中的数据补足。
四、 如何尽量减少问题及问题的损失呢
分析了产生问题的原因,我认为可以采取以下几个措施
1、 在为提高性能为操作系统打开异步 I/O 时,一定要与 oracle 及操作系统技术支持联系把操作系统与异步 I/O 相关的补丁要打全。
2、 制定一个良好的备份恢复策略,最好有表的 exp 备份
3、 要及时的检查硬件的状态,及时更换驱动器部件。
结篇:其实坏块涉及的内容很多的,如果坏块发生的回滚段表空间、数据字典 (system 表空间 ) 或联机日志,这些处理都是特难的,需要与 oracle 的 supporter 联系。不过这些方面的坏的机率很少很少的,在以后的文章中我也会做介绍。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
谢谢楼上,不过系统表和普通的表都是一样的么?坏的是个系统表
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
有没有用rman做备份?
有的话可以使用rman的blockrecover恢复
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行