流配置异常(ORA-01403)的完整解决过(一):http://yangtingkun.itpub.net/post/468/102138
在METALINK上没有什么收获,但是Oracle的官方文档中,记录流应用异常的处理方式。其中就包含了如何处理ORA-01403错误的方法。
Oracle在文档上是这样描述的:
ORA-01403 No Data Found
Typically, this error occurs when an update is attempted on an existing row and the OLD_VALUES in the row LCR do not match the current values at this target site.
To correct this problem, you can update the current values in the row so that the row LCR can be applied successfully. If changes to the row are captured by a capture process at the destination database, then you probably do not want apply this manual change at destination sites.
简单的说,是由于Oracle再更新或删除数据时,WHERE条件中指定的查询条件和数据库中实际的值不匹配。而Oracle给出的解决方法就是手工修改这些值,使得数据库中的数据于LCR中的OLD_VALUE一致。
由于目标数据库没有再设置捕获进程,因此可以省略Oracle给出的设置SET_TAG的步骤,直接UPDATE数据库的值。
虽然Oracle给出了方面,但是Oracle并没有给出具体的实施步骤。要找到数据库中出现错误的数据,以及流应用中LCR中的OLD_VALUE。
考虑使用LOGMNR,但是在目的站点使用LOGMNR无法获得更新0行的DML语句。而源数据站点的日志数据量比较大,很难确定具体是那些数据出现的错误。
因此,只能考虑使用流本身的机制来检查错误。
继续查询流的文档,发现Displaying Detailed Information About Apply Errors这章里面Oracle给出了检查LCR具体数值的方法。
Oracle提供了4个过程,通过调用过程可以将DBA_APPLY_ERROR中指定的或所有的错误信息通过DBMS_OUTPUT包打印到屏幕上。
由于篇幅的限制,Oracle本身提供的4个过程就不列出来了,有兴趣的可以参考Oracle的官方文档。
看起来问题解决了,其实问题才刚刚开始。设置输出的最大值SET SERVEROUTPUT ON SIZE 1000000之后,执行了Oracle提供的PIRNT_TRANSACTION包。
EXEC PRINT_TRANSACTION('13.48.47355')
IXDBA.NET社区论坛我还没有直接打印所有的错误信息,而是仅仅对其中一个事务出现的错误进行了打印,但是输出没有结束就报错了。
ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 32
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 97
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 112
SQL> SELECT ERROR_MESSAGE, MESSAGE_COUNT FROM DBA_APPLY_ERROR WHERE ROWNUM = 1;
ERROR_MESSAGE MESSAGE_COUNT
----------------------------------- --------------------------
ORA-01403: no data found 21815
虽然是一条错误信息,但是里面包含了21815条修改。数据量太大没有办法打印到屏幕上。而且,最重要的是,就算是可以完全打印到屏幕上,如此大的数据量,加上凌乱的格式,我也没办法找到想要的东西。
看来还要继续想办法。