一:版本信息

操作系统版本:AIX 61009

版本:11.2.0.3.11(RAC)


二:错误描述

研发反应,今天他们很多过程报“ORA-12801: 并行查询服务器 P004,ORA-08103: 对象不再存在” 错误。查看了他们的过程具体报错部分发现

都是 insert into test select /*+ parallel(a,4) */ * from test1 a类似的语句报的错


三:错误原因及解决方法
对于这种之前作同样的处理一直是正常的,某天突然出现故障的问题,分析思路还是很清楚的。(一般情况下都是因为对数据库做了变动造成的)

首先看了一下ORACLE 的alert日志没有发现任何报错。然后问了几个同事,结果发现在报错的那个时间段他在对一些分区表做压缩处理。进一步检查发现
报错涉及的表都是他做压缩处理的表。分析到这里已经可以大胆的猜测故障的原因就是因为他的压缩操作。

带着我们的猜测去MOS上查询了一下ORA-08103错误,找到如下两篇NOTE
1)“Getting ORA-1410 or ORA-8103 When Running Select Against Partition or Subpartition With Active Exchange (Doc ID 727597.1)”
2)“OERR: ORA-8103 "object no longer exists" Master Note / Troubleshooting, Diagnostic and Solution (Doc ID 8103.1)”。
从两篇文章中我们知道对数据库中的相关对象(实体对象,如表及索引等)做truncate table,alter index .. rebuild,alter table .. move等操作会使对象的data_object_id发生变化。
如果我们在某个会话正在访问相关对象时,在该对象作如上几种操作,就有可能触发ORA-08103报错。压缩表的分区其实也是一种move操作(alter table aaa move partition PM201407 compress;)
会造成data_block_id改变


四:解决方案
尽量不要在程序运行过程中,对程序设计到的表作变动。