暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一次ORA-00600 案例分析

Oracle蓝莲花 2021-04-15
2747

报错如下:ORA-00600: internal error code, arguments: [ktspgfb-1], [], [], [], [], [], [], [], [], [], [], []

--alert.log日志报错信息如下:

--------------------------------------------------

--产生ORA-00600: internal error code, arguments: [ktspgfb-1]报错的情况概述:

1.ORA-00600 [ktspgfb-1] on Insert Using ASSM Tablespaces

报错说明及其解决方案:

1.1.这个问题已经在未发布的Bug 4382439中被解决,作为未发布的重复错误4067168,parallel并行全表扫描,对于assm segment可能会触发该bug 

1.2.未发布的Bug 4067168的初始修订记录在node4067168.8 - bug4067168,过多的Undo构造cr块加parallel扫描对于assm segment 可能会触发该bug

1.3.Bug 6493013 is fixed in:

11.2.0.1 (Base Release)

11.1.0.7 (Server Patch Set)

10.2.0.5 (Server Patch Set)

1.4.如果是11.2.0.1以下版本产生该报错,Oracle官方建议升级11.2.0.1以上版本或者是应用补丁集Apply patch set 10.2.0.5 or 11.1.0.7或者利用ctas重建对象或者

  利用expdp/exp 导出对象,drop对象在impdp/imp导入方式,或者DBMS_SPACE_ADMIN.ASSM_SEGMENT_SYNCHWM  API重新同步高水位以上和以下之间的数据块,具体操作方法如下:

2.ORA-600 [ktspgfb-1] Raised When Using dbms_stats.gather_dictionary_stats

解决思路同上dbms_space_admin.assm_segment_verify方法


3.ORA-600 [KTSPGFB-1] ON TABLE WITH LOB COLUMN

报错说明及其解决方案:

 1.lob字段shrink或者对于dml字段做dml操作可能会触发ORA-00600: internal error code, arguments: [ktspgfb-1]报错,接口函数堆饯调用顺序为:

 ktspgfblk3 ktsplbfmb ktsplbrecl ktspgsp_main kdlgsp_init kdl_write1

 2.该问题在未发布的Bug 14756359中得到解决

 3.造成此报错可能的情况是数据对象的基本信息一级位图块可能存在逻辑损坏

 4.解决方法可以通过转储dmp文件重新创建表,或者将lob大字段移动到其他表空间或者在线重定义重新定义该堆组织

4.ORA-00600 [ktspgfb-1] On Insert Into LOB Column After TRUNCATE with ASSM

报错解决方案:

1.使用带有SEGMENT SPACE MANAGEMENT MANUAL的本地管理表空间而不是AUTO

---------------------------------------------

--该报错trace文件分析,详见demo1_ora_23901.trc,为了方便分析,我将dump buffer cache信息内容进行了编号

 1.此处表示转储buffer cache信息,对应level为10 level 6 + users/waiters,rdba表示rowid中的相对文件号rfile#+block#块号

 

 2.BH (0xdef7b778)表示buffer header hash value ,file#: 6表示对应6号数据文件,基于v$dbfile的file#字段可以定位对应数据文件,rdba: 0x00064c00 (1024/412672)如上所示,

 通过以下脚本可以定位数据库对象的的对象号,对象号、文件编号、数据块号和行编号

结果集为412672,基于这种方式可以计算出来十进制的rdba,

 class: 8表示表示buffer header对应block的类型,其中8表示1st level bmb以下为具体详细说明(对于class类型介绍和x$bh数据字典介绍详见第三部分介绍):

 ba: 0xde26a000表示BUFFER中block address是block在内存中的物理地址,在x$bh数据字典标记BA字段

 

 3.set: 18该指标对应X$BH的state字段,18具体含义未知,bsz: 8192表示缺省数据块大小

 

 4.obj: 89159对应X$BH.OBJ ,也就是块上数据在哪个对象里

 

 5.hash: [0x15b10e460,0x15b10e460]对应x$bh.nxt_hash x$bh.prv_hash这里用链表,指出下一个及前一个BH的HASH值。

 如果这个hash chain上只有一个bh,则这里的前一个及后一个BH的hash值都是此BH

 

 lru: [0xf4fcb5a8,0x126f7a890]对应x$bh.nxt_repl x$bh.prv_repl这里用链表,指出下一个及前一个BH的在LRU链上HASH值

 

 6.ckptq: [NULL]表示检查点队列上的hash value ,fileq: [NULL]表示文件队列上的hash value 

 

 7.use: [NULL] wait: [NULL]分别对应buffer header 中的user list 和 waiters lists 

 

 8.flags: only_sequential_access 对应x$bh. FLAG

 

 9.buffer tsn: 7 rdba: 0x00064c00 (1024/412672)表示这个数据块的TSN 表空间号和RDBA

 

 10.frmt对应的检查类型为PAGETABLE MANAGED LOB BLOCK

 

 12总结以上指标分析:目前可以看到trace文件dump内容为buffer cache,未来发现dirty blocks情况,buffer header对应block的类型为1st level bmb,对应6号数据文件,数据库

对象为89159,对应dba_objects的data_object_id字段,该对象操作为lob类型blocks,以下对Block Classes 做一个具体分析:

-------------------------------------------

--Block Classes内容分析,基于本trace:

1.每个Oracle块都属于一个blocks class 。block class用于在redo记录中识别undo segments。blocks class 还用于在V$WAITSTAT动态性能视图中产生更细粒度的输出打印结果集

2.V$WAITSTAT显示块争用统计数据。此表仅在启用计时统计时才更新。详见以下查询:

SELECT * FROM V$WAITSTAT WHERE CLASS = Q'{1st level bmb}'

CLASS        COUNT TIME

1st level bmb 102209 1375

其中count表示block class操作等待的数量,time表示操作等待事件综合,秒为单位,以下为block class匹配标准

超过16的block class 保留为撤销段。block class 依赖于撤销段号。每个撤销段有两个block class ;一个用于撤销段头,另一个用于撤销段块。下表显示了前几个blocks class 

block class 存储在更改redo record header.中。block class也出现在redo log dump files中,本案例分析内容个人理解,在事务开始时,重做操作是5.2。此操作更新撤消段头。

选择一个未使用的槽,并更新以表明它正在使用,以下为Redo Level 10 - Index Operations的具体信息矩阵:

KTB Redo 

KTB重做记录对块的事务头的修改。反向操作记录在undo段中每个KTB重做记录都有一个操作类型。已知代码包括

Numeric Code Alphanumeric Code

0x1 F

0x2 C

0x3 Z

0x4 L

0x5 R

0x11 F


XID格式由usn#,slot#,wrap#三部分组成:

usn# Undo segment number

slot# Slot number in undo segment

wrap# Sequence number


uba Undo block address格式由dva seq# rec#三部分组成:

dba Data block address of undo block

seq# Sequence number of undo block

rec# Record number within undo block

-----------------------------------------------

--针对redo的索引操作,如下原理分析给出个人建议:

--案例1 Insert Index Row

insert leaf row表示当前为插入insert leaf操作,如果ITL没有被更新,因为上次的事务更改在提交或回滚之后,就会执行Block cleanout,scn改变了Block cleanout次数基于xid

--案例2 

-------------------------------------------------

x$bh对应数据字典内容介绍 详见X$BH and Latch Contention文档:

--案例分析相关脚本:

-------------------------------------------

                                                                         《点亮梦想,拒绝平庸》

                                                         600团队(QQ群号:851604218)

文章转载自Oracle蓝莲花,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论