百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

ORA-600错误分析(ora06512错误)

sinye56 2024-09-29 22:14 4 浏览 0 评论

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

一 概述

概念

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

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

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

目标

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

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

环境

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

二 案例

1.ora-600 4194

描述:

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

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

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

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

Fri Apr0717:13:052017

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

ORA-00603:ORACLE server session terminated by fatal error

ORA-00600:internal error code,arguments:[4194],[],[],[],[],[],[],[],[],[],[],[]

...

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

DDE:Problem Key'ORA 600 [4194]'was flood controlled(0x6)(incident:343446)

ORA-00600:internal error code,arguments:[4194],[],[],[],[],[],[],[],[],[],[],[]

***ktuc_diag_dmp:dump of current change vector

ktudb big redo:cnt:1um:0x1f39d11d0uba:0x00c001d4.da21.04

***ktuc_diag_dmp:dump of block after image inhex

Dump of memory from0x00000001CF510000to0x00000001CF518000

1CF5100000000E20200C001D48855A6D704010000[..........U.....]

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

Dump of buffer cache at level4fortsn=2rdba=12583380

BH(0x1cffdbf48)file#: 3 rdba: 0x00c001d4 (3/468) class: 36 ba: 0x1cf510000

set:11pool:3bsz:32768bsi:0sflg:2pwc:0,0

dbwrid:0obj:-1objn:0tsn:2afn:3hint:f

hash:[0x1f9fa1260,0x1f9fa1260]lru:[0x1cffdc160,0x1cffdbf00]

obj-flags:object_ckpt_list

ckptq:[0x1cffe2568,0x1f8a32360]fileq:[0x1cffe2578,0x1f8a323c0]objq:[0x1ec8c8b78,0x1c8fd1a18]objaq:[0x1cffe2688,0x1c8fd3b68]

use:[NULL]wait:[NULL]

st:XCURRENT md:NULLfpin:'kcbwh2: kcbchg1'tch:1txn:0x1f50cd960

flags:buffer_dirty mod_started privateblock_written_once

change state:NOT_ACTIVE_YET

change count:1

LRBA:[0x6e34.192b.0]LSCN:[0x0.885ef500]HSCN:[0x0.885ef500]HSUB:[65535]

***ktuc_diag_dmp:dump of redo forrdba0x00c001d4

上面的trc文件里面也没有4194后面详细的参数信息,只有一些数据块后镜像的dump信息,没有其他重要信息。可以判断file#: 3(经过查询,是undo表空间的数据文件)有问题,而且trc文件的xid又比较多,几乎在各个回滚段都存在。

解决方法

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

1.创建新的undo表空间

create undo tablespace undotbs2 datafile'/data/数据库名称/undotbs2.dbf'size30g

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

alter system set undo_tablespace=undotbs2;

3.删除原来的undo表空间

drop tablespace undotbs1 including contents;

2.ora-600 kdsgrp1

描述

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

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

Alert日志部分内容如下:

UseADRCI orSupport Workbench topackagethe incident.

See Note411.1at My Oracle Support forerror andpackaging details.

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

ORA-00600:internal error code,arguments:[kdsgrp1],[],[],[],[],[],[],[],[],[],[],[]

ORA-06512:at"SYS.PRVT_ADVISOR",line6082

ORA-06512:at line1

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

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

row0x0080079a.75continuation at

0x0080079a.75file# 2 block# 1946 slot 117 not found

KDSTABN_GET:0.....ntab:1

curSlot:117.....nrows:105

kdsgrp-dump CR block dba=0x0080079a

Block header dump:0x0080079a

Objectid on Block?Y

seg/obj:0x16b9csc:0x00.8861f1efitc:2flg:Etyp:1-DATA

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

inc:0exflg:0

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

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

Incident511760created,dump file:/oracle/app/diag/rdbms/test/test/incident/incdir_511760/test_m004_14600_i511760.trc

ORA-00600:internal error code,arguments:[kdsgrp1],[],[],[],[],[],[],[],[],[],[],[]

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

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

解决方法

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

Analyze table SYS.WRI$_ADV_EXECUTIONS validate structure online;

Analyze table SYS.WRI$_ADV_EXECUTIONS validate structure cascade online;

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

kdgDump:tsn=1tabn=0

Current Row Piece:rdba=0x00800799slot=0

Head Row Piece:rdba=0x00800799slot=0

kdgDumpRedo:dump redo on table/index mismatch:

table block tsn=1rdba=0x00800799index objn=5821

head rowid0x00800799.0000

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

*kdgDumpRedo:dump data block redo *

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

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

select index_name from dba_indexestwheret.owner='SYS'ANDtable_name='WRI$_ADV_EXECUTIONS';

Alter index index_name rebuild online;

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

3.ora-600 13011

描述

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

Arg[a]Passcount

Arg[b]Data Objectnumber

Arg[c]Tablespace Decimal Relative DBA(RDBA)of block containing the row tobe updated

Arg[d]Row Slot number

Arg[e]Decimal RDBA of block being updated(Typically same as[c])

Arg[f]Code

之前的两个错误解决之后,过一段时间,用户反馈,这个数据库实例又宕了,查看alert日志,内容如下:

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

ORA-00600:internal error code,arguments:[13011],[183830],[8409015],[6],[8409015],[17],[],[],[],[],[],[]

Incident details in:/oracle/app/diag/rdbms/test/test/incident/incdir_535689/test_smon_24580_i535689.trc

UseADRCI orSupport Workbench topackagethe incident.

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

Tue Apr1119:36:282017

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

ORA-00600:internal error code,arguments:[13013],[5001],[183830],[8409015],[6],[8409015],[17],[],[],[],[],[]

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

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

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

解决方法

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

$sqlplus/assysdba

SQL>set serveroutput on size unlimited

SQL>spool outputfile

SQL>@hout.sql

SQL>@hcheck4.sql

SQL>spool off

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

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

Set verify off

Set space0

Set line120

Set heading off

Set feedback off

Set pages1000

Spool analyze.sql

Select'Analyze cluster "'||cluster_name||'" validate structure cascade;'

from dba_clusters

where owner='SYS'

union

Select'Analyze table "'||table_name||'" validate structure cascade;'

from dba_tables

where owner='SYS'andpartitioned='NO'and(iot_type='IOT'oriot_type isNULL)

union

Select'Analyze table "'||table_name||'" validate structure cascade into invalid_rows;'

from dba_tables

where owner='SYS'andpartitioned='YES';

spool off

执行上面生成的analyze.sql 脚本。

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

set pagesize999

select'Alter index '||index_name||' rebuild online;'from dba_indexestwheret.owner='SYS'ANDtable_name in(

30多张表

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

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

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: