问题描述
嗨,康纳,
我在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删除目标表时,新插入的行也被删除了
我在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.
我认为列表中的第一个要点在这里适用。
他说,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




