从这里给出的一系列描述看,主要可能的原因包括:
数据块损坏、索引块损坏、内存损坏、DDL操作导致的异常以及各种bug;
从我们遇到的情况看,数据块/索引块的损坏似乎不存在,因为多次执行并不会总是出现错误;
在先不考虑bug的情况下,就只有DDL操作或者内存异常的情况了,那么是不是DDL操作导致的问题呢?
四、思考与推断
目前看到的这篇MOS文档讲述的还算比较全面,于是我先发送给客户DBA讨论;
然而,客户DBA表示,已经仔细阅读过这篇文档了,而且他们跟应用沟通过,出现问题的时段应该是不会有DDL操作,只会在晚上的固定一个时间段存在一些TRUNCATE操作;另外,他们也在自己的环境也测试过了,truncate并没有导致ORA-1410的报错,而且以过往的经验来看,以前遇到过的truncate导致的查询错误报的都是ORA-8103;所以,这里客户认为可能还是内存的问题或者ORACLE的bug导致的;看来客户DBA还是很有经验的。
对于客户的看法,我是有几分认同的:
1. ORA-1410我似乎很少遇到过,以前遇到过都是索引异常的情况;
2. 另外truncate导致SQL执行报错的情况通常报的是ORA-8103,对象不存在;
3. 如果真的是没有意识到的truncate操作,那前端业务可能已经受到影响了;
这样好像不应该是truncate导致的,但是现象上时好时坏又是怎么产生的呢?如果真的是内存中的异常,那它是怎么好的呢?它的触发条件是什么呢?
趁着与客户网络断断续续的情况,我开始了独自思考。
根据mos 文档的描述问题出现的原因主要有几类:
1. 数据库中存在着频繁的DDL 语句。
2. 某个索引或者数据块出现了损坏,也就是坏块导致的问题
3. 硬件层面,例如:内存出现了问题
4. Oracle 的bug
再仔细回顾一下这个问题的现象逐一思考各种可能原因:
1. DDL语句导致的,但是用户已经确认了DDL语句只会在特定的时间执行。
2. 某个数据块或者索引块损坏,这个可以通过下面的语句来进行判断
SQL>analyze table <table_name> validate structure cascade;
在和用户确认过之后,发现着命令并没有返回坏块相关的信息,基本可以排除坏块的可能。
3. 内存层面的问题,如果是内存层面的问题,更大的可能性是当访问某个表的某一些数据块的时候会出现问题。而且硬件工程师也确认了,内存并没有问题,所以,也基本上可以排除,内存出现问题的可能性。
4. Oracle 的 bug,在 mos上进行了一些搜索之后,也没有找到类似的问题。
五、 测试与模拟
经过上面的思考后,我还是认为truncate操作导致异常的可能性更大,对于这样的case如果能重现出来,相信会非常有说服力,嗯,这样的重现应该是比较简单的,不如直接重现;
于是,我开始在自己的测试环境,同样是10g数据库,Redhat linux环境中来重现,实现操作如下:
1. 创建表,生成更多数据,创建索引