今天在做数据库健康检查的时候发现流配置又出现了问题,查询DBA_APPLY_ERROR视图发现大量的错误,其中错误主要包括两类,一种是ORA-26689: column datatype mismatch in LCR,另一种是ORA-01403: no data found。
其中前几个错误都是数据类型冲突,可以基本上推断出,ORA-1403错误是由于ORA-26689错误造成的。
基本错误情况已经确定,下面需要确定造成错误的原因。根据错误信息描述可以推断,是由于LCR中的数据类型和应用库中的数据类型不一致造成的。那么只需要确定最近一天内源数据库的哪些流复制表做了修改。
而最近一段时间只有一张表CAT_ZONE_PRODUCT做过修改,而且修改的是字段的数据类型。
通过对数据库中错误记录的分析得到相同的答案。分析流的LCR所需存储过程和表如下:
SQL> CREATE SEQUENCE SEQ_MY_REC;
Sequence created.
SQL> CREATE TABLE MY_RECORDS (ID NUMBER, STATMENTS CLOB);
Table created.
SQL> CREATE OR REPLACE PROCEDURE MY_PRINT_ANY(P_DATA IN SYS.ANYDATA, P_STR IN OUT VARCHAR2, P_FLAG IN OUT NUMBER) IS
2 V_TN VARCHAR2(61);
3 V_STR VARCHAR2(4000);
4 V_CHR CHAR(2000);
5 V_NUM NUMBER;
6 V_DAT DATE;
7 V_RW RAW(4000);
8 V_RES NUMBER;
9 BEGIN
10 V_TN := P_DATA.GETTYPENAME();
11 P_FLAG := 0;
12 IF V_TN = 'SYS.VARCHAR2' THEN
13 V_RES := P_DATA.GETVARCHAR2(V_STR);
14 IF V_STR IS NOT NULL THEN
15 P_STR := P_STR || '''' || V_STR || '''';
16 ELSE
17 P_STR := P_STR || ' NULL ';
18 P_FLAG := 1;
19 END IF;
20 ELSIF V_TN = 'SYS.CHAR' THEN
21 V_RES := P_DATA.GETCHAR(V_CHR);
22 IF V_CHR IS NOT NULL THEN
23 P_STR := P_STR || '''' || RTRIM(V_CHR) || '''';
24 ELSE
25 P_STR := P_STR || ' NULL ';
26 P_FLAG := 1;
27 END IF;
28 ELSIF V_TN = 'SYS.NUMBER' THEN
29 V_RES := P_DATA.GETNUMBER(V_NUM);
30 IF V_NUM IS NOT NULL THEN
31 P_STR := P_STR || V_NUM;
32 ELSE
33 P_STR := P_STR || ' NULL ';
34 P_FLAG := 1;
35 END IF;
36 ELSIF V_TN = 'SYS.DATE' THEN
37 V_RES := P_DATA.GETDATE(V_DAT);
38 IF V_DAT IS NOT NULL THEN
39 P_STR := P_STR || '''' || V_DAT || '''';
40 ELSE
41 P_STR := P_STR || ' NULL ';
42 P_FLAG := 1;
43 END IF;
44 ELSIF V_TN = 'SYS.VARCHAR' THEN
45 V_RES := P_DATA.GETVARCHAR(V_STR);
46 IF V_STR IS NOT NULL THEN
47 P_STR := P_STR || '''' || V_STR || '''';
48 ELSE
49 P_STR := P_STR || ' NULL ';
50 P_FLAG := 1;
51 END IF;
www.ixdba.net
52 ELSIF V_TN = 'SYS.RAW' THEN
53 V_RES := P_DATA.GETRAW(V_RW);
54 IF V_RW IS NOT NULL THEN
55 P_STR := P_STR || '''' || V_RW || '''';
56 ELSE
57 P_STR := P_STR || ' NULL ';
58 P_FLAG := 1;
59 END IF;
60 ELSE
61 DBMS_OUTPUT.PUT_LINE('TYPENAME IS ' || V_TN);