续《表扫描与索引扫描返回的行数不一致》

续《表扫描与索引扫描返回的行数不一致

上篇文章主要介绍了如何从分析表得到的报错,以及trace中的信息,判断表返回的记录与索引返回记录不一致时的处理方式。下面这篇文章则介绍了针对ORA-1499进行问题排查的一些基本方法。

OERR: ORA-1499 table/Index Cross Reference Failure - see trace file (文档 ID 1499.1)

Error: ORA 1499
Text: table/Index Cross Reference Failure - see trace file
-------------------------------------------------------------------------------
Cause:  An error occurred when validating an index or a table using the
        ANALYZE command.
        One or more entries does not point to the appropriate cross-reference.
Action: Check the trace file for more descriptive messages about the problem.
        Correct these errors.

ORA-1499的错误是通过“"ANALIZE TABLE|CLUSTER <name> VALIDATE STRUCTURE CASCADE”分析得出的,它的含义是表或聚类和索引之间存在不一致性,具体来讲是索引键值未出现在索引中,或者相反。

trace文件中包含:

<description>: tsn: <tablespace number> rdba: <relative dba>

description有以下值:

"row not found in index" 
"Table/Index row count mismatch"
"row mismatch in index dba"
"Table row count/Bitmap index bit count mismatch"
"kdavls: kdcchk returns %d when checking cluster dba 0x%08lx objn %d\n"

tsn:    Tablespace Number表示的是索引存储的表空间编号。

rdba: 是索引段头相对于数据块的存储地址。

SQL> analyze table DEPT validate structure cascade;
analyze table case7 validate structure cascade
*
ERROR at line 1:
ORA-01499: table/index cross reference failure - see trace file

trace文件的实例:

row not found in index tsn: 5 rdba: 0x02c00061

哪些索引受影响?

包含ORA-1499的trace文件提供了与索引相关的段头rdba。查询dba_segments来明确索引:

SELECT owner, segment_name, segment_type, partition_name

FROM   DBA_SEGMENTS
WHERE  header_file = (SELECT file#
                                          FROM   v$datafile
                                          WHERE  rfile# = dbms_utility.data_block_address_file(to_number('&rdba','XXXXXXXX'))
                                          AND  ts#= &tsn)
                 AND header_block = dbms_utility.data_block_address_block(to_number('&rdba','XXXXXXXX'));

&rdba值应该是删除’0x‘的十六进制的rdba,tsn是表空间编号。

例如:

SELECT owner, segment_name, segment_type, partition_name
FROM DBA_SEGMENTS
WHERE header_file = (SELECT file#
                                         FROM   v$datafile
                                     WHERE  rfile# = dbms_utility.data_block_address_file(to_number('02c00061','XXXXXXXX'))
                                        AND  ts#= 5)
                AND header_block = dbms_utility.data_block_address_block(to_number('02c00061','XXXXXXXX'));

明确受影响的键值

如果需要明确所有受影响的键,需要运行一次全表扫描和索引扫描:

在表中但未在索引的行:

SELECT /*+ FULL(t1) */ rowid, <indexed column list>
FROM   <Table name> t1
MINUS
SELECT /*+ index(t <Index name>) */ rowid, <indexed column list>
FROM   <Table name> t;

在索引中但未在表中的行:

SELECT /*+ index(t <Index name>) */ rowid, <indexed column list>

FROM   <Table name> t
MINUS
SELECT /*+ FULL(t1) */ rowid, <indexed column list>
FROM  <Table name> t1;

实例:

表名 = DEPT,索引名 = I_DEPT1,在索引I_DEPT1中的索引列:DEPTNO,DNAME.
SELECT /*+ FULL(t1) */ rowid, deptno, dname
FROM   dept t1
MINUS
SELECT /*+ index(t I_DEPT1) */ rowid, deptno, dname
FROM   dept t;

确保查询语句的执行计划使用受影响的索引,例如I_DEPT1会展示在执行计划中。查询未使用索引的原因之一是因为索引列定义为允许NULL值。如果是这样,可以添加一个where子句,例如:where deptno is not null。

导致这种问题的根本原因就是表和索引之间的不一致,可能是由于Oracle的defect产生,或者Oracle外部问题,例如IO丢失。硬件或OS子系统问题可能导致IO丢失写入。如果出现IO丢失,包含表或索引的块修改操作就可能不会写入Oracle的数据文件中,引起键缺失。解决方法可以参考上一篇文章《表扫描与索引扫描返回的行数不一致》。当出现表和索引之间不一致的情况,即表中的行不在索引中,删除并重建索引是常用的一种合适方法。

时间: 2024-11-05 19:28:05

续《表扫描与索引扫描返回的行数不一致》的相关文章

新版续费、升级云服务器

  云服务器控制台支持包年包月计费的云服务器进行续费和升级操作. 如图,包年包月的云服务器列表的操作部分,包括续费(如蓝框线所示)和升级操作(如红框线所示). 点击"续费"后,出现续费页面.选择续费时长,并点击确定. 点击"升级"后,出现升级页面.选择要变更的CPU内存.新增的数据盘和带宽.确认金额后点击"确定".

网站建设为什么如此便宜 企业建站续警惕

很多人问到为什么有的网站制作要收几万元,甚至几十万元,可是很多网站建设公司的报价却很便宜,一千多块,甚至几百块,为什么一个网站有如此悬殊的报价,便宜的到底便宜在哪里?一般来说,网站要求的功能不同价格自然也不同,功能相对复杂的价格自然较高,功能简单的自然就低.然而同一类功能复杂程度的网站建设(如企业产品展示型网站)为什么有些公司报的价格那么便宜,到底便宜在哪里? 一.便宜在没有营销策划 专业的网站建设都是基于企业的营销战略的,只有了解企业所处的行业.客户使用习惯.竞争对手的情况才可以有针对性地规划

关于Servlet、Jsp中的多国语言显示(续)

js|servlet|显示 续   --- /*** Insert the method's description here.* Creation date: (2001-2-4 17:28:17)* @return java.util.Enumeration*/public Enumeration getParameterNames() {if (pairs == null) return null;return pairs.keys();}/*** Insert the method's

从麦当劳可乐续杯看网站开发的思想

麦当劳可乐能否续杯,突然又开始讨论了,这源于刘润的这篇文章,当然也有人说了另外一家M记不能续杯的案例. 其实,问题的焦点无非有两个:1.提供续杯的话,很多"小人"会钻空子.2.M记在中国有歧视. 第二条属于废话,一讲到中国人的素质和外企在国内如何如何的话,就有一堆大道理,比如说去M记.K记吃东西一定要拿发票,否则就让外企偷税漏税了.MD,有时候真想不通,难道中国的企业就可以获得中国消费者的宽容了吗?ft~~~ 这里要讲讲第二条,当然不是讨论是不是有人钻空子的问题,而是讲一些在做网站.做

(续前)SQLServer常见问题应对

server|sqlserver|问题 (续前)SQLServer常见问题应对 版权所有ashuixu转载请保持完整并注明出处 SQL语句部分 5."令人头疼"的日期处理 问题:你是否也有过面对日期处理时的彷徨无措么? 解答:你是否了解以下事实(摘选自SQLServer2000联机帮助-datetime 数据类型:概述): A.日期的存储. datetime 从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为百分之三秒(等于 3.33 毫秒或

轻松搞定数据访问层[续]

访问|数据 数据库表 Tbl_Teacher 数据字段名称 类型 说明 teaID Int 自动编号 teaCode Char(20) 教师员工号 teaName Nchar(10) ? teaGender Bit ? teaNation Nchar(6) ? teaAge TinyInt ? Tbl_Student 数据字段名称 类型 说明 stuID Int 自动编号 stuCode Char(20) 学生证号 stuTeacherCode Char(20) 班主任的员工号 stuName

一周学会C#(前言续)

一周学会C#(前言续) C#才鸟(QQ:249178521) 4.标点符号 { 和 } 组成语句块 分号表示一个语句的结束 using System; public sealed class Hiker { public static void Main() { int result; result = 9 * 6; int thirteen; thirteen = 13; Console.Write(result / thirteen); Console.Write(result % thir

一周学会C#(前言续二)

一周学会C#(前言续二) C#才鸟(QQ:249178521) 8.操作符 操作符 类型 + - * / %(取余数) 算术 && || ! ?: 逻辑 < <= > >= 关系 == != 相等 = 赋值 9.编程风格 · 较正规的编程风格 w 在一个二元操作符的每一边都加一个空格 w 在每一个逗号后面而不是前面加一个空格 w 每一个关键字后面加一个空格 w 一行一个语句 w 分号前不要有空格 w 函数的园括号和参数之间不加空格 w 在一元操作符和操作数之间不加空

vb神童教程(续)

第一部分:vb数据库操作实例 vb神童教程(续)--编写一个小型的信息管理系统 vb神童教程(续)--准备数据库 vb神童教程(续)--设计系统的界面及对象的属性 vb神童教程(续)--为对象添加事件代码 第二部分:补充内容 vb神童教程(续)--ODBC数据源简介 vb神童教程(续)--配置Access数据源 vb神童教程(续)---配置SQL Server数据源 vb神童教程(续)--VB的ADO对象 vb神童教程(续)--vb adodb Connection对象简介 vb神童教程(续)-

vb神童教程(续)--编写一个小型的信息管理系统

本文来演示一下如何用vb向数据库中添加.修改.删除记录这些操作.我觉得自己是比较菜的,几年来别人都在进步,只有我还在原地踏步.不过没有办法,我们这一圈人里现在只有我机器上还有vb6,勉为其难,只有尝试一下了.如果我写的这点幼稚的东西能为想要了解vb数据库操作的朋友提供哪怕是一丁点儿的参考和帮助,将是我最为高兴的事情,同时也希望高手不要见笑. 我做的这个实例名为"编程入门网网址管理系统",算是一个小型的信息管理系统吧.该系统后台使用的是Access数据库,程序中使用ADO代码链接的形式连