物化视图日志被drop后无法闪回,因其属系统级结构、不入回收站;必须按原定义重建,否则物化视图增量刷新将失败或降级为全量刷新。
物化视图日志(materialized view log)被 drop 后无法用闪回表恢复,必须重建 —— 因为它不是普通表,也不是回收站里的对象。
为什么 FLASHBACK TABLE 对物化视图日志无效
物化视图日志本质是 Oracle 内部管理的系统级结构,底层依赖 SNAP$ 和 MLOG$ 等字典表,不进入用户回收站(USER_RECYCLEBIN)。执行 DROP MATERIALIZED VIEW LOG ON t1 后:
• SELECT * FROM USER_RECYCLEBIN 查不到对应条目
• FLASHBACK TABLE mlog$_t1 TO BEFORE DROP 会报错 ORA-38305: object not in RECYCLE BIN
• 即使开了 ENABLE ROW MOVEMENT,FLASHBACK TABLE 也不支持该对象类型
重建物化视图日志的实操要点
重建不是简单重跑 CREATE MATERIALIZED VIEW LOG,必须严格匹配原定义,否则依赖它的物化视图刷新会失败:
- 先确认原日志是否含
SEQUENCE、ROWID、PRIMARY KEY或INCLUDING NEW VALUES—— 这些参数影响物化视图增量刷新逻辑 - 查历史 DDL(如果审计开启):
SELECT SQL_TEXT FROM DBA_AUDIT_TRAIL WHERE OBJ_NAME = 'T1' AND ACTION_NAME = 'DROP' AND TIMESTAMP > SYSDATE - 7 - 若无审计,从物化视图定义反推:
SELECT QUERY_TXT FROM SYS.SNAP$ WHERE NAME = 'MV_T1',看其基表和刷新方式 - 重建语句示例(必须与原一致):
CREATE MATERIALIZED VIEW LOG ON t1 WITH SEQUENCE, ROWID, PRIMARY KEY INCLUDING NEW VALUES;
重建后物化视图能否正常刷新?
能,但有前提:
- 物化视图本身没被删,且状态仍是
VALID(查USER_MVIEWS的LAST_REFRESH_DATE和STALENESS) - 重建的日志必须包含原物化视图所需的列(例如,若 MV 刷新用到
col_a,而新日志没加(col_a),则REFRESH会报ORA-12034) - 首次刷新建议用
DBMS_MVIEW.REFRESH('mv_t1', 'C')(完全刷新),避免因日志断点导致增量失败 - 注意:重建日志不会自动补全删除期间的变更记录 —— 那段窗口内的数据差异需人工干预或接受全量重刷
最易被忽略的是日志字段粒度与物化视图刷新策略的耦合性。哪怕只漏一个 SEQUENCE,FAST REFRESH 就会退化成 COMPLETE,而这个降级在日志重建后不会报错,只会悄悄变慢。











