在检查DBA_APPLY_ERROR视图,发现了很多应用失败的事务,失败错误原因为:ORA-01403: no data found。
数据库的流配置在应用阶段设置DISABLE_ON_ERROR参数为N,应用虽然可以跳过错误的事务继续执行与之不相关的事务,但是受错误影响而报错的事务会越来越多。
系统的流环境不是我搭建的,虽然近来一段时间虽然看了一些流的概念,对流的工作原理大致清楚,但是基本上没有实际动手配置过流环境,流环境的维护操作也不是很熟悉。因此,只能临时抱佛脚,一边查询Oracle的文档,一边解决实际问题。所幸的是,用了两天半的时间(琐碎的事情比较多,不可能把全部时间投在一件事情上,两天半的时间还包括大半天的新系统上线的工作,汗),终于解决了问题。
庆幸之余,打算把解决问题的过程和思路记录下来。最主要的目的是记录一下问题的产生已经解决方法,顺便整理一下自己写的一个过程。另外一个考虑是,希望其他人可以从这篇文章中得到一些东西。虽然问题是在流环境中出现的,但是问题的解决和处理过程中需要的流的知识并不是很多,而是通过大量的PL/SQL代码解决了问题。无论是读者能从里面学到一些Oracle的使用技巧,还是能发现到一种解决问题的思路,亦或是能感悟到一个DBA所需的基本素质——细心、信心和锲而不舍的精神。那么我发布这篇文章的目的就达到了。
需要说明的是,由于解决问题前后历时三天,很多关键信息的屏幕打印记录已经找不到了,当时并没有打算要总结成一篇文章,也没有去保存。错误很难重新而且短期内也不打算重新了。所以,我只能根据印象去补充,或者简单的口述处理。有不准确的地方在所难免,希望尽量可以描述清楚。
最后说明一点,由于本人对流的配置、维护的了解还处于起步阶段,可能很多复杂的步骤可以通过简单的方式来解决,甚至可能解决方法本身就是错误的。如果你发现了类似的问题,也请帮忙指出。
首先,简单描述一下环境。
数据库版本为Oracle9204 for Solaris,配置流环境的时候打了一个补丁3339368。
流环境比较简单,是单向的流复制。有两个源数据库对于一个应用数据库。出问题的是其中一个源数据库和应用数据库。
问题产生:
前一段时间由于开发人员的疏忽,在更新的时候漏掉了一个WHERE语句,导致系统负荷突然增加,3个小时内产生的REDO日志的数量是平时一天的20多倍。这对流的捕获来说,绝对是一个灾难,虽然被海量更新的表不是需要捕获的表,但是在捕获进程仍然要处理比平时大得多的数据量。
可能是由于压力比较大的原因,导致了后台出现了两个ORA-600错误。
Errors in file /opt/oracle/admin/zjtrade/bdump/zjtrade_cp01_18471.trc:
ORA-00600: internal error code, arguments: [knlcEnqueueLCR250], [3023165202], [0], [3023191099], [0], [], [], []
而后,在应用端则出现了ORA-01403: no data found。
在METALINK上查询了ORA-600错误,发现这个问题似乎是Oracle的bug。
IXDBA.NET技术社区在Metalink上查到的文档信息:https://metalink.oracle.com/metalink/plsql/showdoc?db=NOT&id=2892926.8&blackframe=1
这篇文档是bug2892926的一个支持性描述文档,包含的内容比较简单:
Bug 2892926 Streams may fail with OERI [knlcEnqueueLCR250]
This note gives a brief overview of bug 2892926.
Affects:
Product (Component) | Oracle Server (Rdbms) |
Range of versions believed to be affected | Versions < 10G |
Versions confirmed as being affected | 9.2.0.4
|
Platforms affected | Generic (all / most platforms affected) |
Fixed:
This issue is fixed in | 9.2.0.5 (Server Patch Set)
10g Production Base Release
|
Symptoms:
Internal Error may occur (ORA-600)
ORA-600 [knlcEnqueueLCR250]
Related To:
Streams / Logical Standby
Description
Streams may fail with ORA-600 [knlcEnqueueLCR250]