物化视图日志不会自动同步基表新增列,需手动重建日志并显式包含所有物化视图引用的列(含新增列)、primary key、rowid、sequence及including new values,否则fast刷新失败。

物化视图日志不会自动同步基表新增列
基表执行 ALTER TABLE ... ADD COLUMN 后,已存在的物化视图日志(MLOG$_xxx)**完全不会感知该变更**。日志结构是建表时静态定义的,不随基表 DDL 自动扩展。只要物化视图定义中用到了这个新列(比如在 SELECT 列表、JOIN 条件或 WHERE 中),FAST 刷新就会因“找不到对应变更记录”而失败,直接退化为 COMPLETE 或报 ORA-12054。
为什么 EXPLAIN_MVIEW 会显示 REFRESH_FAST_AFTER_INSERT = 'NO'
运行 DBMS_MVIEW.EXPLAIN_MVIEW('MV_NAME') 后查 MV_CAPABILITIES_TABLE,若看到 REFRESH_FAST_AFTER_INSERT 的 possible 为 NO,且 msgtxt 提示 “column not in log”,说明问题就在这里。Oracle 在校验 FAST 能力时,会逐个比对物化视图 SQL 中出现的每一列是否都在日志的 SEQUENCE 子句里声明过——哪怕只漏一个,整条路径就被禁用。
- 日志必须显式包含所有 SELECT 列(包括表达式列,如
TRUNC(date_col)) -
INCLUDING NEW VALUES不解决新增列问题,它只影响分区交换后新数据是否写入日志 - 重建日志前,先确认原日志状态:
SELECT status FROM dba_objects WHERE object_name = 'MLOG$_BASE_TABLE_NAME';若为INVALID,必须先DROP再重建
重建日志的正确写法和关键参数
不能只补列,必须完整重建日志,并确保覆盖全部依赖项:
- 基表要有主键或唯一约束(
PRIMARY KEY是 FAST 前提) - 日志语句必须带
ROWID(除非基表是 IOT) -
SEQUENCE后括号内要列出物化视图中所有非常量列,含新增列 - 必须加
INCLUDING NEW VALUES,否则分区操作(如EXCHANGE)变更无法捕获
示例:CREATE MATERIALIZED VIEW LOG ON base_table WITH PRIMARY KEY, ROWID, SEQUENCE (id, name, new_col, sales_date) INCLUDING NEW VALUES;
重建后仍刷新失败?检查三个隐性断裂点
即使日志重建成功,FAST 仍可能静默失效,常见于以下三处未同步:
- 物化视图本身未重新编译:
ALTER MATERIALIZED VIEW mv_name COMPILE—— 否则compile_state保持INVALID,fast_refreshable显示NO - 基表主键被删或失效:查
dba_constraints确认constraint_type = 'P'且status = 'ENABLED' - 物化视图日志表的
master_object_id与基表object_id不一致:这是 DDL 后对象元数据错位的典型表现,必须重建日志才能修复
真正容易被忽略的是:基表加列后,哪怕物化视图没引用它,只要日志里缺了其他已有列(比如之前漏建 ROWID),也会导致 FAST 失效——Oracle 的校验是全量的,不是按需的。











