暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle mview刷新中的异常行为

askTom 2017-10-27
1981

问题描述

嗨,康纳,

我在OTN上问了这个问题:
我们有一些带连接的mviews,我们发现有时基表的更新将导致mview上的insert delete,而不是delete insert。因为插入是第一位的,所以我们必须使主键或唯一约束可延迟。这很好,但是如果mview被GG复制,在目标站点上它将通过主键删除,刷新后它不仅删除旧数据,还删除新数据。如果删除出现在插入之前,那么这将不是问题。这个实现背后的原因是什么?

下面是一个重现它的测试用例:

jsu @ JSU12P> 从v $ 版本中选择 *;

横幅CON_ID
-
Oracle数据库12c企业版版本12.1.0.2.0-64位生产0
PL/SQL版本12.1.0.2.0-生产0
核心12.1.0.2.0生产0
适用于64位窗口的TNS: 版本12.1.0.2.0-生产0
NLSRTL版本12.1.0.2.0-生产0

-- 为测试用例创建两个表

创建表test_parent (
pid编号不为空约束test_parent_pk主键
,c1号
,c2号
)
/

使用ROWID,主键,包含新值的序列在test_parent上创建物化视图日志;

创建表test_child (
cid号不为空约束test_CHILD_pk主键
,c3号
,c4号
,pid number constraint test_child_fk references test_parent(pid)
)
/

使用ROWID,主键,包含新值的序列在test_child上创建物化视图日志;

插入到test_parent值 (1,1,1) 中;
插入到test_child值 (1,1,1,1);
提交;

------ 现在创建mview

创建物化视图MV_TEST
按需快速刷新
使用主键
作为
SELECT p.ROWID 作为P_ROWID
,c.rowid 作为C_ROWID
,c.cid
,c.c3
,c.c4
,c.pid
,p.c1 123为c1
来自test_child c,test_parent p
WHERE c.pid = p.pid(+)
/

ALTER TABLE MV_TEST ADD CONSTRAINT MV_TEST_PK PRIMARY KEY(cid)DEFERRABLE INITIALLY DEFERRED;

从MV_TEST中选择 *;


--------------- 设置一个触发器和审计表,用于观察刷新行为

创建序列mv_audit_seq顺序;

创建表mv_audit (seq编号,dml varchar2(10),cid编号);

创建或替换触发器trg_mv_test
在每一行的MV_TEST上插入或删除或更新之后
声明
v_dml varchar2(10);
开始
v_dml := 插入时的大小写,然后是 'I'
删除时,则为 “d”
更新时,则为 “u”
结束;

插入到mv_audit值 (mv_audit_seq.nextval,v_dml,: new.cid);

结束;
/

------- 运行下面的DML以重现此问题。父表的更新将触发mview刷新中的异常行为

jsu @ JSU12P> 更新测试 _ 父集C1 = NVL(C1,0) 1;

1行更新。

jsu @ JSU12P> 提交;

提交完成。

jsu @ JSU12P> 执行DBMS_MVIEW.REFRESH ('mv_test ','F');

PL/SQL过程成功完成。

jsu @ JSU12P> 选择 * 从mv_audit order by seq;



SEQ DML CID
----------
1 U 1
2 I 1
3 D

------ 如您所见,它首先进行了更新,然后插入,然后删除
------ 插入后发生删除
------ 此时,如果您具有GG复制,则源mv_test具有一行,目标mv_test具有零行,因为当它通过主键cid = 1删除目标表时,新插入的行也被删除了


专家解答

我和Goldengate PM谈过了。

他说,moviews得到了Goldengate的支持,但须符合以下条件:


Materialized views are supported by Extract in classic and integrated modes with the following limitations.

- Materialized views created WITH ROWID are not supported.
- The materialized view log can be created WITH ROWID.
- The source table must have a primary key.
- Truncates of materialized views are not supported. You can use a DELETE FROM statement.
- DML (but not DDL) from a full refresh of a materialized view is supported. If DDL support for this feature is required, open an Oracle GoldenGate support case.
- For Replicat the Create MV command must include the FOR UPDATE clause
- Either materialized views can be replicated or the underlying base table(s), but not both.


我认为列表中的第一个要点在这里适用。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论