Oracle 10 标准:
我有许多基于预建表的物化视图。
这些是通过来自一个主数据库的链接从远程数据库快速刷新的。
它们通常工作正常,但有时在数据库服务器被退回时需要重新创建视图。
现在将远程(复制的)表与主表进行比较表明,复制的表中缺少一些记录。重新创建物化视图并不能解决这个问题(或手动刷新它)。快速刷新这些的作业没有显示错误。
解决此问题的程序是什么?我是否需要删除并重新生成主表上的物化视图日志?
附加信息:
好的,删除并重新创建物化视图日志并不能解决此问题。
我想我可以手动复制记录,但我认为会有一种更通用的方法来修复。如果complete refresh
是答案,我知道它首先会截断表格,如果可能的话,我真的很想避免这种情况。
根据要求,这是创建物化视图的脚本:
CREATE MATERIALIZED VIEW AUTO_EVENT_DEFN
ON PREBUILT TABLE
USING INDEX
TABLESPACE DATA1
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 81920
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
REFRESH
NEXT SYSDATE + 1/(24*60)
FAST
WITH PRIMARY KEY
USING DEFAULT LOCAL ROLLBACK SEGMENT
DISABLE QUERY REWRITE AS
select aed_rid, name, description, max_check_freq_sec, max_result_freq_sec, header, footer, subject, html_format,
report_group, trigger_event, max_lines, html_base_size, ins_or_update, active, valid, defn_type, cust_req, last_modified,
modified_by, sum_cols, report_delay_secs, process_queue, sql_string, report_security, results_type, multi_loc
from auto_event_defn@kitlive;
这正是在已经过时的预建表上创建物化视图时发生的情况。
以同样的方式重新创建 mview 并不能解决这个问题,为什么会这样呢?您仍然使用相同的不完整预建表。
重新创建 mview 日志与它无关。如果您现在重新创建 mview 日志,则不包括过去修改过的数据。
是的,解决方案是完全刷新,这并不一定会截断表格。
刷新程序
DBMS_MVIEW.REFRESH
有一个名为的参数atomic_refresh
,默认为true
.atomic_refresh
设置为的完整刷新刷新true
单个事务中作为参数给出的所有 mview。它是通过DELETE
-ing mview 中的行来实现的。完全刷新
atomic_refresh
设置为false
刷新在单独事务中作为参数给出的所有 mview。它是通过TRUNCATE
-ing mviews 来实现的(这比 快得多DELETE
)。所以指定
atomic_refresh => true
,并且 mview 不会被截断。