联系:手机/微信(+86 17813235971) QQ(107644445)
标题:由于数据块scn大于数据库scn导致ORA-600 kcbzib_kcrsds_1错误
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
以前遇到ORA-600 kcbzib_kcrsds_1一般都是数据库强制打开的时候,这次在一个open的库中遇到该问题,做一个记录
在expdp过程中有一个表报ORA-01555错误
. . 导出了 "SRM_DEV"."AAAAAA" 3.256 MB 4636 行 ORA-31693: 表数据对象 "SRM_DEV"."XXXXXXX" 无法加载/卸载并且被跳过, 错误如下: ORA-02354: 导出/导入数据时出错 ORA-01555: 快照过旧: 回退段号 (名称为 "") 过小
这种错误,根据以往经验,大部分情况是由于lob字段异常引起
查看表结构
SQL> desc "SRM_DEV"."XXXXXXX" 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- DELIVERY_ID NOT NULL NUMBER(19) ARRIVAL_CUSTOMER_ID NUMBER(19) ARRIVAL_LOCATION_TYPE VARCHAR2(255 CHAR) ARRIVAL_SUPPLIER_ID NUMBER(19) ARRIVAL_TIME TIMESTAMP(6) ARRIVAL_USER NUMBER(19) CREATE_BY VARCHAR2(32 CHAR) CREATE_TIME TIMESTAMP(6) DELIVERY_DATE VARCHAR2(32 CHAR) DELIVERY_NO VARCHAR2(32 CHAR) DELIVERY_TYPE VARCHAR2(32 CHAR) INVOICE_TYPE VARCHAR2(2) IS_CONFIRM VARCHAR2(2) IS_ONEKEY_IO VARCHAR2(2) IS_SUPPORTING VARCHAR2(32 CHAR) MODI_BY VARCHAR2(32 CHAR) MODI_TIME TIMESTAMP(6) OP_ATTRIBUTE VARCHAR2(1 CHAR) PRINT_TIMES NUMBER(10) RECEIVE_COMPANY VARCHAR2(64 CHAR) RECEIVE_LOCATION VARCHAR2(64 CHAR) RECEIVE_SUPPLIER_ID NUMBER(19) REMARK VARCHAR2(256 CHAR) STATUS VARCHAR2(5 CHAR) SUPPLIER_CODE VARCHAR2(64 CHAR) SUPPLIER_ID NUMBER(19) OVERDUE_STATUS VARCHAR2(255 CHAR)
确认没有lob字段而引起了该问题,进一步分析
对表进行全扫描看看报什么错误
SQL> select /*+full(t)*/ count(1) from "SRM_DEV"."XXXXXXX" t;
select /*+full(t)*/ count(1) from "SRM_DEV"."XXXXXXX" t
*
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [kcbzib_kcrsds_1], [], [], [], [], [], [],
[], [], [], [], []
根据以往经验,怀疑是由于这个表中的某个block的scn大于数据库scn导致
对全表扫描过程进行跟踪
C:\Users\Administrator>sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 12月 21 22:18:46 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> oradebug setmypid
已处理的语句
SQL> alter session set db_file_multiblocK_read_count=1;
会话已更改。
SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12
已处理的语句
SQL> oradebug TRACEFILE_NAME
F:\APP\diag\rdbms\srmdev\srmdev\trace\srmdev_ora_14768.trc
SQL>
SQL>
SQL> select /*+full(t)*/ count(1) from "SRM_DEV"."XXXXXXX" t;
select /*+full(t)*/ count(1) from "SRM_DEV"."XXXXXXX" t
*
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [kcbzib_kcrsds_1], [], [], [], [], [], [],
[], [], [], [], []
分析trace文件确认对应的block为20548
WAIT #758663789368: nam='db file sequential read' ela= 40 file#=7 block#=20545 blocks=1 obj#=73756 tim=47881962193 WAIT #758663789368: nam='db file sequential read' ela= 41 file#=7 block#=20546 blocks=1 obj#=73756 tim=47881962259 WAIT #758663789368: nam='db file sequential read' ela= 40 file#=7 block#=20547 blocks=1 obj#=73756 tim=47881962325 WAIT #758663789368: nam='db file sequential read' ela= 41 file#=7 block#=20548 blocks=1 obj#=73756 tim=47881962389 Encountered exception while getting args for function:0x00007FF6F0BC39A0 2025-12-21T22:19:17.768815+08:00 Incident 1562659 created, dump file: F:\APP\diag\rdbms\srmdev\srmdev\incdir_1562659\srmdev_ora_14768_i1562659.trc ORA-00600: 内部错误代码, 参数: [kcbzib_kcrsds_1], [], [], [], [], [], [], [], [], [], [], []
对异常block进行dump分析
PARSE #758663744160:c=0,e=97,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=0,tim=48020763236
Start dump data blocks tsn: 4 file#:7 minblk 20548 maxblk 20548
Block dump from cache:
Dump of buffer cache at level 3 for pdb=0 tsn=4 rdba=29380676
WAIT #758663744160: nam='db file sequential read' ela= 88 file#=7 block#=20548 blocks=1 obj#=73756 tim=48020763396
Block dump from disk:
buffer tsn: 4 rdba: 0x01c05044 (7/20548)
scn: 0x6a37b2cb8 seq: 0x02 flg: 0x06 tail: 0x2cb80602
frmt: 0x02 chkval: 0xe203 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x000000B0A274D000 to 0x000000B0A274F000
B0A274D000 0000A206 01C05044 A37B2CB8 06020006 [....DP...,{.....]
B0A274D010 0000E203 001B0001 0001201C A37B2CB4 [......... ...,{.]
B0A274D020 00068000 00321F02 01C05001 00160010 [......2..P......]
B0A274D030 0409F0A2 010001A8 000C0776 00002001 [........v.... ..]
通过这里可以确认当前block的scn为0x6a37b2cb8==>28512562360
查询当前数据库scn
SQL> select CURRENT_SCN from v$database; CURRENT_SCN -------------- 28512556338
通过分析确认当前数据库的scn小于该block的scn,所以报ORA-600 kcbzib_kcrsds_1错误.解决该问题的方法有两种
1. 调整数据库是scn,让数据库的scn 大于该block scn即可
2. 通过把该block的scn修改小一些(目的就是数据库scn大于block scn)
通过处理之后实现表正常查询
SQL> alter system checkpoint;
系统已更改。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
--------------------
28512563830
SQL> select /*+full(t)*/ count(1) from "SRM_DEV"."XXXXXXX" t;
COUNT(1)
--------------------
19560
对于这种情况除了ora-600 kcbzib_kcrsds_1的报错之外,还可能会遇到ora-600 kcbzibmlt_kcrsds_1的错误
