Oracle主库更新后从库未同步,如何通过视图日志检查刷新模式问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计757个文字,预计阅读时间需要4分钟。
相关专题
物化视图在主库更新后从库没同步,根本原因不是“刷新没触发”,而是物化视图日志(materialized view log)本身在data guard备库上不可用——oracle默认不复制物化视图日志表,且备库是只读的,无法写入日志。
物化视图日志不会被DG自动同步
这是最容易被忽略的前提:DG只传输归档日志和在线重做日志,不传输用户创建的物化视图日志表(如 MLOG$_sales)。这些日志表存在于主库的用户schema下,属于普通堆表,不在DG保护范围内。
- 你在主库执行
CREATE MATERIALIZED VIEW LOG ON t1,只会在主库建一张MLOG$_T1表;从库上完全不存在这张表 - 即使主库对
t1做了DML,日志记录只写入主库的MLOG$_T1,从库既看不到、也写不了 - 所以从库上的物化视图(哪怕定义相同)根本无法做快速刷新(
FAST),DBA_MVIEW_ANALYSIS.FAST_REFRESHABLE必然为NO
从库上物化视图只能用COMPLETE刷新模式
如果你硬要在备库建一个同名物化视图,它只能走 COMPLETE 刷新路径,也就是全量重查主表。但这又引出两个现实问题:
- 备库是只读的,
REFRESH COMPLETE会报错ORA-16000: database open for read-only access - 即使你临时切到读写模式(比如快照备用库),
COMPLETE刷新会锁表、扫全表、消耗大量I/O,不适合高频或大表场景 - 更关键的是:它不依赖日志,也就谈不上“同步延迟”,只是定时拉一次快照而已——这已经不是传统意义的“同步”,而是离线快照
检查物化视图刷新模式时必看的三个地方
不要只查 DBA_MVIEWS.REFRESH_METHOD,它只告诉你“想怎么刷”;真正决定能不能刷的,是底层支撑是否就位:
- 查日志是否存在:
SELECT * FROM USER_MVIEW_LOGS WHERE MASTER = 'YOUR_TABLE';—— 备库上这条一定查不到结果 - 查快速刷新能力:
SELECT FAST_REFRESHABLE FROM DBA_MVIEW_ANALYSIS WHERE MVIEW_NAME = 'YOUR_MV';—— 主库可能为YES,但从库一定是NO(因为静态评估时发现日志表不可见) - 查刷新作业状态:
SELECT LAST_REFRESH_DATE, NEXT_REFRESH_DATE, BROKEN FROM DBA_JOBS WHERE WHAT LIKE '%dbms_mview.refresh%';—— 从库上这类作业通常根本启不来,或者一跑就失败
真正的同步链路里,物化视图不是DG的数据同步机制,它和DG是正交的两套东西。想让从库有准实时数据,要么用DG原生的物理/逻辑备库能力,要么在主库建好物化视图后,把查询路由过去——别指望在从库上靠物化视图“补同步”。
本文共计757个文字,预计阅读时间需要4分钟。
相关专题
物化视图在主库更新后从库没同步,根本原因不是“刷新没触发”,而是物化视图日志(materialized view log)本身在data guard备库上不可用——oracle默认不复制物化视图日志表,且备库是只读的,无法写入日志。
物化视图日志不会被DG自动同步
这是最容易被忽略的前提:DG只传输归档日志和在线重做日志,不传输用户创建的物化视图日志表(如 MLOG$_sales)。这些日志表存在于主库的用户schema下,属于普通堆表,不在DG保护范围内。
- 你在主库执行
CREATE MATERIALIZED VIEW LOG ON t1,只会在主库建一张MLOG$_T1表;从库上完全不存在这张表 - 即使主库对
t1做了DML,日志记录只写入主库的MLOG$_T1,从库既看不到、也写不了 - 所以从库上的物化视图(哪怕定义相同)根本无法做快速刷新(
FAST),DBA_MVIEW_ANALYSIS.FAST_REFRESHABLE必然为NO
从库上物化视图只能用COMPLETE刷新模式
如果你硬要在备库建一个同名物化视图,它只能走 COMPLETE 刷新路径,也就是全量重查主表。但这又引出两个现实问题:
- 备库是只读的,
REFRESH COMPLETE会报错ORA-16000: database open for read-only access - 即使你临时切到读写模式(比如快照备用库),
COMPLETE刷新会锁表、扫全表、消耗大量I/O,不适合高频或大表场景 - 更关键的是:它不依赖日志,也就谈不上“同步延迟”,只是定时拉一次快照而已——这已经不是传统意义的“同步”,而是离线快照
检查物化视图刷新模式时必看的三个地方
不要只查 DBA_MVIEWS.REFRESH_METHOD,它只告诉你“想怎么刷”;真正决定能不能刷的,是底层支撑是否就位:
- 查日志是否存在:
SELECT * FROM USER_MVIEW_LOGS WHERE MASTER = 'YOUR_TABLE';—— 备库上这条一定查不到结果 - 查快速刷新能力:
SELECT FAST_REFRESHABLE FROM DBA_MVIEW_ANALYSIS WHERE MVIEW_NAME = 'YOUR_MV';—— 主库可能为YES,但从库一定是NO(因为静态评估时发现日志表不可见) - 查刷新作业状态:
SELECT LAST_REFRESH_DATE, NEXT_REFRESH_DATE, BROKEN FROM DBA_JOBS WHERE WHAT LIKE '%dbms_mview.refresh%';—— 从库上这类作业通常根本启不来,或者一跑就失败
真正的同步链路里,物化视图不是DG的数据同步机制,它和DG是正交的两套东西。想让从库有准实时数据,要么用DG原生的物理/逻辑备库能力,要么在主库建好物化视图后,把查询路由过去——别指望在从库上靠物化视图“补同步”。

