免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2695 | 回复: 5
打印 上一主题 下一主题

oracle的错误提示是什么意思? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-26 13:09 |只看该作者 |倒序浏览
朋友在邮局上班,邮局使用的ems信息查询系统后台是oracle数据库

投递反馈信息录入错误提示:

邮件插入失败。ORA-01578:ORACLE data block corrupted(file # 2,block # 16300)
              ORA-01110:data file 2: '/ems/oracle7/oradata/EMS/rbs01.dbf'


投递反馈信息查询错误提示:


警告 P_INQUIRY失败:ORA-01578:ORACLE data block corrupted(file # 2,block # 16300)
                    ORA-01110:data file 2: '/ems/oracle7/oradata/EMS/rbs01.dbf'
                    ORA-06512:at "EMS_USER.P_INQUIRY",line 879
                    ORA-06512:at line 1.

这几个错误提示是什么意思啊?

论坛徽章:
0
2 [报告]
发表于 2007-01-26 13:13 |只看该作者
回滚段损坏,请从备份中恢复,但是如果不太懂的话,建议找专业服务公司。否则数据有丢失的危险。

如果在广东,可以找我。

论坛徽章:
0
3 [报告]
发表于 2007-01-26 13:16 |只看该作者
如果你自己很懂的话,根据如下步骤去恢复。


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<sid>.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<sid>.log ,找到 ORA-01578 的报错信息,并记录下 file# 及 block 的值,我这里是 126 和 88490 。

B、 执行以下语句看哪个段坏了

SQL>Select * from dba_extents

2 where file_id=<F>

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、 要及时的检查硬件的状态,及时更换驱动器部件。

论坛徽章:
0
4 [报告]
发表于 2007-01-26 13:18 |只看该作者
回滚段损坏……好像很严重吧

是rbs01.dbf这个数据文件的回滚段损坏了吧

现在系统还在使用,可不可以重做回滚段,免去恢复啊?

论坛徽章:
0
5 [报告]
发表于 2007-01-26 14:55 |只看该作者
你用的是ORACLE 8或7吧?简单的处理办法,查下v$rollstat看下坏的rollseg上的事务有重要数据,如没有;那简单的你改下INITXXXX。ORA把坏的这个rollseg删了,需要使用一个隐藏参数,好久没用8了,想不起来具体是什么(应该是个强制不使用某rollseg的参数):(,然后重启ORACLE,重新建立一个rollseg就OK了。对于生产库来说,这个方法的缺点就是需要停ORACLE。:)

论坛徽章:
0
6 [报告]
发表于 2007-01-29 14:29 |只看该作者
谢谢各位援手,问题已经及时解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP