前言:
最近处理一个应用报障,RAC集群数据库在不同的节点查询分区表数据不一致的问题,把处理和分析的过程分享给大家,希望对大家有所帮助。
问题:
RAC集群不同节点查询同一个分区数据结果不一致问题。
原因:
1 表trade_xxxx_xxxx分区索引trade_xxxx_xxxx_gl在集群不同节点存在数据差异,导致集群不同节点访问该索引的sql查询返回结果不一致。
2 对于分区索引trade_xxxx_xxxx_gl在集群不同节点存在数据差异的根因,目前暂无发现,但是在Oracle的官方上存在类似的问题由于DDL操作导致节点内存维护的分区信息出现错误引发节点分区数据不一致的bug,怀疑很有可能是bug导致的
分析过程:
在节点一查询表trade_xxxx_xxxx分区20220212,返回0行数据。
节点二查询表trade_xxxx_xxxx分区20220212,返回686693行数据。
执行sql期间,后台并没有ORA错误发生。
使用10053对sql解析过程进行跟踪,sql执行路径在全表扫描以及索引全扫描两者间,选择了cost消耗较低的索引全扫描方式。
测试强制sql走表访问路径,不走索引
节点一访问有数据。
节点二访问也有数据,并且两节点数据一致,都为358665。
到这里,可以确认通过索引trade_xxxx_xxxx_gl访问数据有异常。
通过analyze分析索引没有发现坏块。
analyze index trade_xxxx_xxxx_gl validate structure;
接下来,通过Oracle官方查看是否有匹配当前场景的BUG,没有发现完全匹配的BUG。
但我们可以发现在当前数据库11.2.0.4版本,存在BUG关于RAC节点同一个SQL,同一执行计划分区查询数据结果不同的问题,问题原因为DDL操作导致节点内存维护的分区信息出现错误,进而影响数据的访问,但问题根因Oracle并未进行说明。
所以,对于分区索引trade_xxxx_xxxx_gl在集群不同节点存在数据差异的根因,目前暂无发现,但是在Oracle的官方上存在类似的问题由于DDL操作导致节点内存维护的分区信息出现错误引发节点分区数据不一致的bug,怀疑很有可能是bug导致的
最后,我们对问题索引TRADE_XXXX_XXXX_GL进行了重建。
再次通过索引查询数据,访问数据正常,问题得到修复。
问题解决:
1. 重建索引TRADE_XXXX_XXXX_GL修复问题。
2. 应用最新的psu补丁11.2.0.4.220719,避免潜在的bug。