物化视图日志被删或未建时无法闪回恢复,必须人工精准补建;漏掉sequence、rowid、primary key或including new values任一参数,fast刷新将静默降级为complete。

物化视图日志被删或从未建过,不能靠闪回恢复,必须人工补建——且参数稍有偏差,FAST刷新就会静默退化为COMPLETE,而你可能几天后才注意到报表变慢。
查清原日志定义是补建的前提
补建不是凭记忆重写CREATE MATERIALIZED VIEW LOG,而是还原原始配置。漏掉SEQUENCE、ROWID、PRIMARY KEY中任意一项,或INCLUDING NEW VALUES缺失,都会导致后续REFRESH FAST失败或降级。
- 若开启审计:查
DBA_AUDIT_TRAIL中ACTION_NAME = 'CREATE'且OBJ_NAME为基表名的记录 - 若未审计但物化视图仍存在:从
SYS.SNAP$反推,执行SELECT QUERY_TXT FROM SYS.SNAP$ WHERE NAME = 'MV_NAME',结合查询语句中用到的列和连接方式,判断日志是否需ROWID或PRIMARY KEY - 直接查当前日志结构(如果曾建过):
SELECT LOG_TABLE, MASTER, ROWIDS, PRIMARY_KEY, FILTER_COLUMNS FROM USER_MVIEW_LOGS WHERE MASTER = 'T1',注意FILTER_COLUMNS字段会列出SEQUENCE()中显式声明的列
补建语句必须严格匹配原参数组合
WITH子句里各选项不是可选开关,而是刷新逻辑的契约。例如,物化视图定义含聚合但无GROUP BY,则日志必须含INCLUDING NEW VALUES;若物化视图依赖ROWID做增量识别,日志就必须带ROWID,哪怕基表有主键。
- 常见合法组合:
WITH ROWID、WITH PRIMARY KEY、WITH SEQUENCE(col1, col2)、WITH ROWID, SEQUENCE(col1), INCLUDING NEW VALUES - 禁止单独用
WITH SEQUENCE()不带ROWID或PRIMARY KEY——Oracle会报ORA-12053 - 新增列后补建:若基表后来加了
NOT NULL列(如ALTER TABLE t ADD c NUMBER NOT NULL DEFAULT 0),该列必须显式加入SEQUENCE(c),否则FAST刷新会在第一次更新时报ORA-12034
补建后首次刷新必须用COMPLETE
重建的日志不会补全删除期间的变更记录,日志表MLOG$_t1从空开始计数。直接跑REFRESH FAST会因缺少断点前的变更而失败或跳过部分数据。
- 执行
DBMS_MVIEW.REFRESH('mv_name', 'C')完成一次全量同步 - 确认
USER_MVIEWS.STALENESS = 'FRESH'且LAST_REFRESH_DATE更新成功 - 再切换回
REFRESH FAST,后续增量才真正生效 - 检查日志是否可用:
SELECT CAN_USE_LOG FROM USER_MVIEWS WHERE MVIEW_NAME = 'MV_NAME',返回YES才算就绪
最容易被忽略的耦合点:日志字段粒度与MV定义强绑定
哪怕只少一个SEQUENCE列,或误删INCLUDING NEW VALUES,系统也不会报错拒绝刷新,而是自动降级为COMPLETE——这个过程无声无息,只在监控里看到刷新耗时陡增。
补建完成后务必验证:用EXPLAIN_MVIEW检查物化视图是否仍支持FAST,而不是仅看CREATE语句有没有语法错误。











