备库中ORA-00600错误的简单修复

最近偶尔会接到一条短信,提示某个备库中出现了ORA-00600的错误。对于这个问题还真不能心存侥幸,自己带着疑问查看了一下,
这是一个一主两备的库,主库和其中的一个备库没有任何的ORA-00600的错误,只有这一个备库中偶尔会出现ORA-00600的错误。
这个问题如果放大还是很严重的,比如主库出现问题了,如果切换到这个备库,那么ORA-00600的错误就会直接转移过来,这个时候这儿备库就有点鸡肋的味道了。所以这个问题一种思路就是重新搭建备库,另外一种就是手工修复。我还是更希望通过手工修复的方式来先来看看能不能解决掉这个问题。
报错的备库数据库日志如下:
Media Recovery Waiting for thread 1 sequence 654 (in transit)
Recovery of Online Redo Log: Thread 1 Group 7 Seq 654 Reading mem 0
  Mem# 0: /U01/app/oracle/fast_recovery_area/TESTSOB0/onlinelog/o1_mf_7_9lo8zrpc_.log
Mon Sep 21 08:36:02 2015
Archived Log entry 650 added for thread 1 sequence 653 ID 0xfe9af939 dest 1:
Mon Sep 21 12:18:09 2015
Errors in file /U01/app/oracle/diag/rdbms/testb0/testob0/trace/ordermob0_ora_26830.trc  (incident=403849):
ORA-00600: 鍐呴儴閿欒?浠g爜, 鍙傛暟: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /U01/app/oracle/diag/rdbms/testob0/testob0/incident/incdir_403849/testob0_ora_26830_i403849.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Mon Sep 21 12:18:11 2015
Sweep [inc][403849]: completed
Sweep [inc2][403849]: completed
Mon Sep 21 12:18:11 2015
Dumping diagnostic data in directory=[cdmp_20150921121811], requested by (instance=1, osid=26830), summary=[incident=403849].
Mon Sep 21 12:37:06 2015
Errors in file /U01/app/oracle/diag/rdbms/testob0/testob0/trace/testob0_ora_26766.trc  (incident=403918):
ORA-00600: 鍐呴儴閿欒?浠g爜, 鍙傛暟: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /U01/app/oracle/diag/rdbms/testob0/ordermob0/incident/incdir_403918/testob0_ora_26766_i403918.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Mon Sep 21 12:37:08 2015
Sweep [inc][403918]: completed
Sweep [inc2][403918]: completed
Mon Sep 21 12:37:08 2015
Dumping diagnostic data 

而对于日志中提到的trace文件,得到的内容如下:
/U01/app/oracle/diag/rdbms/testob0/testob0/trace/testob0_ora_26766.trc 
*** 2015-09-21 12:37:04.930
*** SESSION ID:(1898.8357) 2015-09-21 12:37:04.930
*** CLIENT ID:() 2015-09-21 12:37:04.930
*** SERVICE NAME:(SYS$USERS) 2015-09-21 12:37:04.930
*** MODULE NAME:(JDBC Thin Client) 2015-09-21 12:37:04.930
*** ACTION NAME:() 2015-09-21 12:37:04.930
 
* kdsgrp1-1: *************************************************
            row 0x01c55b6f.1f continuation at
            0x01c55b6f.1f file# 7 block# 351087 slot 31 not found
KDSTABN_GET: 0 ..... ntab: 1
curSlot: 31 ..... nrows: 32
kdsgrp - dump CR block dba=0x01c55b6f
Block header dump:  0x01c55b6f
 Object id on Block? Y
 seg/obj: 0x12739  csc: 0x00.10bfb352  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1c55481 ver: 0x01 opc: 0
     inc: 0  exflg: 0

而第一次抛出ORA-00600的错误,可以追溯到2014年了,所以还是一个遗留问题。
这个错误代表的含义是对应的索引ROWID,在数据表中找不到记录,还是有数据不一致的情况。
从trace文件里也可以看到,其实是在运行一条sql语句的时候抛出来的错误。
SELECT  nvl(count(distinct USER_ID),0) as userCount,nvl(SUM(goods_price),0) as total FROM TEST_ORDER WHERE (IS_SANDBOX   = 0 or IS_SANDBOX is null) and  (order_status = 2 or order_status = 4) and UPDATE_DATE >=to_date(:1,'yyyy-mm-dd') and UPDATE_DATE <to_date(:2,'yyyy-mm-dd')+1  and (substr(MEDIA_CHANNEL_ID,0,2)='10' or substr(MEDIA_CHANNEL_ID,0,2)='20')  AND app_id = :3
至于问题怎么定位,trace中的内容值得好好琢磨一下。
* kdsgrp1-1: *************************************************
            row 0x01c55b6f.1f continuation at
            0x01c55b6f.1f file# 7 block# 351087 slot 31 not found
这个就代表错误出现在7号数据文件,351087号数据块上。
可以通过下面的语句来定位错误是否在TEST_ORDER这个表上
SQL> select owner,segment_name,segment_type from dba_extents where file_id=7 and block_id<=351087 and (block_id+blocks)>=351087;
OWNER                SEGMENT_NAME         SEGMENT_TYPE
-------------------- -------------------- ------------------------------------------------------
TESTOB             TEST_ORDER             TABLE

对于这个问题,MOS中已经提供了完整的解决方法。
ORA-600 [kdsgrp1] During Table/Index Full Scans (文档 ID 468883.1)

一种是通过dump出来数据,然后设置对应的事件,重建修复
#1 alter system dump datafile 7 block 351087;            
另外一种是直接声明跳过那些坏块,可以直接使用dbms_repair来修复。
  execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER'); 
但是因为问题发生在备库所以还是无法运行这个包的。
SQL>    execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER'); 
BEGIN dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER'); END;
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at "SYS.DBMS_REPAIR", line 419
ORA-06512: at line 1
所以还是需要在主库来运行,尽管主库中还是没有这个错误的。
SQL>    execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER'); 
PL/SQL procedure successfully completed.
执行过程很快,修复后自己也在观察是否还收到过ORA的错误警告,按照目前的情况来看,这个问题应该还是顺利解决了,因为已经过去了快两周,之前每一两天就会抛个错误。

时间: 2024-12-25 11:17:16

备库中ORA-00600错误的简单修复的相关文章

一个备库中ORA错误信息的分析

最近也在处理一些遗留的问题,所以对于使用orabbix的报警还是心怀敬畏之心,一方面是我们让它能够做全方位的监控,另一方面也让我发现我们还是存在不少的小问题,小问题虽小,但是放大了,就是大麻烦,甚至数据库事故. 自从上次在社群分享了DB time的抖动案例之后,有不少的朋友似乎对这个工具很感兴趣,我做这个分享的一个主要原因就是希望大家在有些细节中发现问题,至于我分享的问题原因,都是各种各样的小问题,有些朋友也纳闷这种错误似乎还是比较低级的,通过一般的监控都应该解决,但是确实存在,发现了解决了,就

11g备库中碰到自己给自己埋的坑

记得之前在一半技术一半生活中分享过一个设计,因为业务的需求,为了提高业务的处理效率,采用了根据业务的拆库拆表的方式,类似下面的图示. 开发团队也很给力,帮我们协调了好的机器,加了内存,也在新业务2的环境上同步了表结构,抽取了部分数据,然后业务2就开始了紧张的测试, 通过这几天的测试,发现系统的性能逐步稳定下来.忙完了这茬,赶紧来考虑搭建备库. 自己也算是搭建过很多dataguard环境了,一般的环境中检测dataguard搭建成功与否的一种方式就是使用dg broker来验证,一条简单的show

备库查询导致的ORA-01110错误及修复

   最近帮助业务部门解决了一个技术问题,因为发现有数据问题需要对存在问题的数据做分析.当然一个难点就是把数据给筛选出来,当我看到他们提供的语句,在备库做了简单的数据评估之后,发现数据量比想象的要多,大概有200万条左右的数据,而业务部门手头有一个excel文件,需要和这些数据做一些比对,当然停了下筛选逻辑还蛮复杂,最开始建议他们数据量太大,使用excel还是可能出问题,但是业务部门认为应该没有太大的问题,他们会有excel中的公式等来处理,想想也有道理,就提供给了他们一个近40M的文件.   

mysql主键的缺少导致备库hang

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题): (1).现

DG2.1——物理备库搭建

原文转自:http://blog.csdn.net/tianlesoftware/article/details/5547565 1.linux平台 Data Guard 环境: 操作系统: redhat 5.5 Primary数据库: IP地址:211.87.147.69 数据库SID:mynew1 DB_UNIQUE_NAME:mynew1_pd   Standby数据库: IP地址:211.87.147.68 数据库SID:mynew1 DB_UNIQUE_NAME:mynew1_st  

mysql主键的缺少导致备库hang住_Mysql

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题):(1).现象

备库报警邮件的分析案例(二)

在第一篇中分享了关于备库报警邮件的分析,发现很多问题都是一环扣一环. 起初是通过监控主库中的v$dataguard_status发现备库中可能存在一些问题,结果逐步分析,发现是由备库的crontab触发了备库的定时read-only和online状态,(即只读和应用日志,10gR2的环境),而这些关键信息都是从数据库的alert日志中发现的,但是问题还没有完,才刚刚开始,因为发现备库中竟然有ORA-1652: unable to extend temp segment by 128 in tab

由报警邮件分析发现的备库oracle bug

昨天到公司之后,收到两份封报警邮件,可以看到在早晨6:30左右主库的v$dataguard_status检查时发现了一个错误.然后再2分钟后就自动恢复了. 一般这种问题很自然想到可能是网络出现了一些问题.因为自动恢复了,所以也不同太着急处理,于是细细看了下.报警邮件如下: ZABBIX-监控系统: ------------------------------------ 报警内容: DG_issue ------------------------------------ 报警级别: PROBL

你的备库做好准备了吗

这篇文章计划了一段时间,本来想写篇心情文字,还是留到周末再放飞心情吧. 今天的内容是关于数据库的备库的思考,当然我们可以自己问自己,我们的备库准备工作做好了吗?扪心自问,其实有些工作我也没有准备好,这是我的建议,其实一个备库的思考点还是有很多值得考量和斟酌的地方.自己也需要后续完善 备库总是在容灾中有着举足轻重的作用,但是故障难免,我们的备机备库是否能够在危机降临的时候顶住压力,这个需要打上一个问号,我会从硬件配置,系统层面,数据库层面,架构层面和网络层面进行一些分析.硬件配置    备库硬件配