物化视图日志中存在错误ORA-12096一例

采用REFRESH  FAST ON  DEMAND增量刷新物化视图时,按常规建立步骤是先在源库上建物化视图日志,再在目标库上建物化视图。一般来说,没有什问题产生,但有时库的环境或者其它索引什么的,源库上的物化视图日志在生成表结构时就会发一些变数。

CREATE MATERIALIZED VIEW LOG ON source_base.t_a WITH PRIMARY KEY;
简单的语句背后,还有很多其它一些变数。

物化视图日志的名称:MLOG$_基表名。
物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE或明确指定列名。上面这些情况产生的物化视图日志的结构都不相同。
任何物化视图都会包括的列:
SNAPTIME$$(DATE):用于表示刷新时间(关键字段)。
DMLTYPE$$(VARCHAR2(1)):用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。
OLD_NEW$$(VARCHAR2(1)):用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。
CHANGE_VECTOR$$(RAW(255)): 表示修改矢量,用来表示被修改的是哪个或哪几个字段。

1.WITH ROWID,则物化视图日志中会包含:
M_ROW$$:用来存储发生变化的记录的ROWID。

2.WITH PRIMARY KEY,则物化视图日志中会包含基表主键列。

3.WITH OBJECT ID,则物化视图日志中会包含:
SYS_NC_OID$:用来记录每个变化对象的对象ID。

4.WITH SEQUENCE,则物化视图日子中会包含:
SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。

5.WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。

建好物化视图日志表后,不要急于去目标库建物化视图,而要"仔细核对"物化视图日志表的"字段"及"字段类型"(这一点相当重要),
看是否与基表还有自己期望的一致.

笔者就遇到过,源表建过索引的(如下图的JJ_UID字段)字段类型为NUMBER,而物化视图日志自动加上该字段后,把类型设置为TIMESTAMP.

在以后的物化视图同步中,出现下面的错误:
2012-12-03 11:03:31, 更新行情记录出错:UPDATE t_base set LCLOSE='8.5200',TOPEN='8.5300',THIGH='8.5300' WHERE a='123456' 
ORA-12096: "source_base"."t_a" 上的实体化视图日志中存在错误
ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 NUMBER

如下图:

物化视图日志中存在错误ORA-12096一例_第1张图片

【第二天】经过今天观察,在建物化视图日志表时,jj_uid字段并不出现,而是在刷新过程中,这个字段会自动加在日志表里,类型自动为TIMESTAMP,此字段是为源表同其它表同步所用,源表索引中会自动出现以这个字段所建的索引。目前采用修改日志表jj_uid类型为NUMBER(20)(同源表类型一致)运行一天后,目前源表和目标表同步正常。



你可能感兴趣的:(oracle,oracle,oracle,数据库)