作者简介:种英明,ORACLE数据库工程师,就职于北京海天起点南京分公司,拥有多年数据库开发,管理,维护经验,获有ORACLEOCP和MySQLOCP证书,擅长ORACLE安装升级,故障处理以及sql优化,了解SQLServer,Sybase等多种数据库技术。

一概述

概念

ORA-600错误是一般oracle程序异常的内部错误,它表明一个进程遇到了一个低级的、意外的情况。Ora-600错误发生的时候,后面的方括号内会有一个参数列表。格式:ORA600“internalerrorcode,arguments:[%s],[%s],[%s],[%s],[%s]”。

第一个参数是内部消息号或字符串,这个参数和数据库版本号对找到Ora-600的根本原因和潜在影响至关重要。剩余的参数是用来提供进一步的信息。

第一个参数可以帮助缩小问题范围。可以认为是由Oracle的源代码很多地方引用的功能。ora-600trace文件里有更详细的调用堆栈信息,可以帮助我们找到一个解决方案。

目标

ORA-600错误对数据库管理员来说并不陌生,总会遇到过那么几次。一旦遇到ORA-600错误不要简单的认为就是oracle软件bug导致,其实这种错误,不仅种类很多而且有很多原因导致的,包括oraclebug,断电,内存错误,程序异常,讹传等,需要根据错误种类具体去分析。

本文通过一个ORA-600多种错误的故障案例,分析这种错误产生的原因,以及解决方法。为以后数据库管理人员提供一个借鉴和参考,避免走弯路。

环境

操作系统版本Oracle版本主机IP10.1.1.40(非真实)ORACLE_SIDtest(非真实)数据文件存放方式Veritas文件系统归档模式

二案例

1.ora-6004194

描述:

ORA-00600[4194]错误一般是由于重做记录号和最大的回滚记录号不一致导致的,格式:”ORA-600[4194][a][b]”。

第一个参数就是最大的回滚记录号,第二个参数重做记录号。

当然还有很多其他的原因导致ORA-00600[4194]错误,比如说smon执行事务恢复,回滚段冲突或者损坏,oraclebug等。

通过查看alert日志,部分内容如下:

FriApr0717:13:052017

Errorsinfile/oracle/app/diag/rdbms/test/test/trace/test_ora_16389.trc(incident=343469):

ORA-00603:ORACLEserversessionterminatedbyfatalerror

ORA-00600:internalerrorcode,arguments:[4194],[],[],[],[],[],[],[],[],[],[],[]

从alert日志来看4194后面的参数都是空的,不是两个记录号不一致的原因,如果需要进一步确定原因,需要查看对应的trace文件:test_ora_16389.trc,trace部分内容如下:

DDE:ProblemKey'ORA600[4194]'wasfloodcontrolled(0x6)(incident:343446)

ORA-00600:internalerrorcode,arguments:[4194],[],[],[],[],[],[],[],[],[],[],[]

***ktuc_diag_dmp:dumpofcurrentchangevector

ktudbbigredo:cnt:1um:0x1f39d11d0uba:0

***ktuc_diag_dmp:dumpofblockafterimageinhex

Dumpofmemoryfrom0x00000001CF510000to0x00000001CF518000

1CF5100000000E20200C001D48855A6D704010000[.U..]

……………省略一部分…………………….

Dumpofbuffercacheatlevel4fortsn=2rdba=12583380

BH(0x1cffdbf48)file:3(经过查询,是undo表空间的数据文件)有问题,而且trc文件的xid又比较多,几乎在各个回滚段都存在。

解决方法

由于不适合对单个回滚段进行offlink或者drop,而且数据库现在还可以正常打开,于是通过下面的方法重建undo表空间:

1.创建新的undo表空间

createundotablespaceundotbs2datafile'/data/数据库名称/'size30g

2.切换UNDO表空间为新的UNDO表空间

altersystemsetundo_tablespace=undotbs2;

3.删除原来的undo表空间

droptablespaceundotbs1includingcontents;

2.ora-600kdsgrp1

描述

ORA-00600[kdsgrp1]错误原因有很多,比如说并行的DML,索引坏块,数据坏块,CR读,Buffercache数据块不一致。

由于数据库已经宕了多次,Buffercache的数据不一致可以排除,暂时无法排除其他错误原因。

Alert日志部分内容如下:

UseADRCIorSupportWorkbenchtopackagetheincident.

Errorsinfile/oracle/app/diag/rdbms/test/test/trace/test_m004_14600.trc(incident=511761):

ORA-00600:internalerrorcode,arguments:[kdsgrp1],[],[],[],[],[],[],[],[],[],[],[]

ORA-06512:at"_ADVISOR",line6082

ORA-06512:atline1

相关错误比较多,根据alert日志内容查找kdsgrp1错误对应的trace文件,这个mmon进程的trace文件,几乎所有的错误都在这个trc文件:test_m004_14600.trc部分内容如下:

*kdsgrp1-1:*************************************************

0

KDSTABN_GET:0..ntab:1

curSlot:117..nrows:105

kdsgrp-dumpCRblockdba=0x0080079a

Blockheaderdump:0x0080079a

ObjectidonBlock?Y

seg/obj:0x16b9csc:0:2flg:Etyp:1-DATA

brn:0bdba:0x800796ver:0x01opc:0

inc:0exflg:0

……………省略一部分……………………

*kdsgrp1-2:*************************************************

Incident511760created,dumpfile:/oracle/app/diag/rdbms/test/test/incident/incdir_511760/test_m004_14600_

ORA-00600:internalerrorcode,arguments:[kdsgrp1],[],[],[],[],[],[],[],[],[],[],[]

在trc文件里,没有找到sql的信息,也没有坏块的问题。在test_m004_14600.trc文件最后一部分,又提供了两个incident文件:test_m004_14600_,test_m004_14600_,这两个incident文件里没有其他的报错信息也没有kdsgrp1错误更详细的信息。但是可以根据file1946信息,可以判断所在的对象有问题,查询这个数据块上的对象:


file1946是属于$_ADV_EXECUTIONS表,表空间是:SYSAUX,可以使用dbv工具检查这个数据文件,但是没有任何的错误信息。说明数据文件物理上没有损坏。可以基本上判断没有找到对应的数据行。

解决方法

对$_ADV_EXECUTIONS表执行一致性检查:

$_ADV_EXECUTIONSvalidatestructureonline;

$_ADV_EXECUTIONSvalidatestructurecascadeonline;

执行第一个语句没有问题,说明表结构没有问题。执行第二条语句,出现错误,生成trace文件:test_ora_8604.trc,文件部分内容如下:

kdgDump:tsn=1tabn=0

CurrentRowPiece:rdba=0x00800799slot=0

HeadRowPiece:rdba=0x00800799slot=0

kdgDumpRedo:dumpredoontable/indexmismatch:

tableblocktsn=1rdba=0x00800799indexobjn=5821

*************************************

*kdgDumpRedo:dumpdatablockredo*

*************************************

通过上面的文件信息”table/indexmismatch”,可以判断是数据不一致。于是重建索引。

selectindex_namefromdba_='SYS'ANDtable_name='WRI$_ADV_EXECUTIONS';

Alterindexindex_namerebuildonline;

再次执行一致性检查,没有报错。

3.ora-60013011

描述

ORA-00600[13011]错误一般是DML语句引起的,无法获取一个稳定的数据集,格式:”ORA-600[13011][a][b][c][d][e]”,数据库版本至少8.0.3,下面是mos上对这个参数说明:

Arg[a]Passcount

Arg[b]DataObjectnumber

Arg[c]TablespaceDecimalRelativeDBA(RDBA)ofblockcontainingtherowtobeupdated

Arg[d]RowSlotnumber

Arg[e]DecimalRDBAofblockbeingupdated(Typicallysameas[c])

Arg[f]Code

Errorsinfile/oracle/app/diag/rdbms/test/test/trace/test_smon_24580.trc(incident=535689):

ORA-00600:internalerrorcode,arguments:[13011],[183830],[8409015],[6],[8409015],[17],[],[],[],[],[],[]

Incidentdetailsin:/oracle/app/diag/rdbms/test/test/incident/incdir_535689/test_smon_24580_

UseADRCIorSupportWorkbenchtopackagetheincident.

……………省略一部分……………………

TueApr1119:36:282017

Errorsinfile/oracle/app/diag/rdbms/test/test/trace/test_smon_24580.trc(incident=547590):

ORA-00600:internalerrorcode,arguments:[13013],[5001],[183830],[8409015],[6],[8409015],[17],[],[],[],[],[]

偶尔有ora-600kdsgrp1错误,查看trcce文件,还是报”file2090slot64notfound“这种错误。另外多了ORA-00600:[13013]错误,根据13013后面的参数,数据库有问题的对象主要集中在8409015和183830上。

对应的trc文件:test_smon_24580.trc,基本上是一些数据块的dump的内容,没有”file”之类信息或者其他重要信息。

由于出现错误的对象比较多,也为了防止后期还会出现同样的错误,所以对整个数据库sys对象进行检查。

解决方法

1.使用mos提供的脚本,可以从文档上面下载,这个脚本用于检查数据字典是否有错误,执行方法如下:

$sqlplus/assysdba

SQLsetserveroutputonsizeunlimited

SQLspooloutputfile

SQL@

SQL@

SQLspooloff

查看生成的文件,数据字典没有问题

2.使用如下sql生成脚本,用于检查所有sys用户的表一致性。

Setverifyoff

Setspace0

Setline120

Setheadingoff

Setfeedbackoff

Setpages1000

Select'Analyzecluster"'||cluster_name||'"validatestructurecascade;'

fromdba_clusters

whereowner='SYS'

union

Select'Analyzetable"'||table_name||'"validatestructurecascade;'

fromdba_tables

whereowner='SYS'andpartitioned='NO'and(iot_type='IOT'oriot_typeisNULL)

union

Select'Analyzetable"'||table_name||'"validatestructurecascadeintoinvalid_rows;'

fromdba_tables

whereowner='SYS'andpartitioned='YES';

spooloff

执行上面生成的脚本。

在执行结果里面找ORA-01499table/indexcrossreferencefailure错误,也就是表和索引信息不一致的表的信息。大概有30多张表。

setpagesize999

select'Alterindex'||index_name||'rebuildonline;'fromdba_='SYS'ANDtable_namein(

30多张表

最后对这30多张表的索引进行重建。

Rebuild索引时,可能会出现WRH$_PGASTAT表里复合主键上重复数据导致rebuild失败,删除重复数据,然后再次rebuild这个表上的索引。