能同步但需满足三个硬性条件:源库有主键+日志、DBLINK为PUBLIC且权限足够、目标库建MV时显式指定REFRESH FAST ON DEMAND;缺一则退化全量或报错。
能同步,但必须满足三个硬性条件:源库有主键+日志、DBLINK通且权限够、目标库建MV时显式指定REFRESH FAST ON DEMAND。缺一不可,否则自动退化为全量刷新或直接报错。
Oracle 的 FAST 刷新依赖物化视图日志(MATERIALIZED VIEW LOG)记录增量变更,而该日志默认只支持基于主键或 ROWID 的捕获方式。源表若无主键:
WITH PRIMARY KEY 会报错;WITH PRIMARY KEY 虽能建日志,但后续创建物化视图时指定 REFRESH FAST 会触发 ORA-12015;WITH ROWID 基本不可用——远程表的 ROWID 在目标库无意义,且要求查询中显式包含 ROWID 字段,维护成本高。所以真实生产环境里,优先在源库执行:ALTER TABLE your_table ADD CONSTRAINT pk_your_table PRIMARY KEY (id);,再建日志:CREATE MATERIALIZED VIEW LOG ON your_table WITH PRIMARY KEY;。
物化视图刷新由 Oracle 内部调度用户(非当前会话)触发,普通私有 DBLINK 对其不可见。常见卡点:
CREATE PUBLIC DATABASE LINK,不能省略 PUBLIC;SELECT 权限,且不能被 ACCOUNT LOCK;SELECT 1 FROM DUAL@dblink,得查真实表:SELECT COUNT(*) FROM your_table@dblink;USING 后字符串完全一致(大小写敏感),监听需 reload 过。直接 CREATE MATERIALIZED VIEW ... AS SELECT 让 Oracle 自动建表,会导致字段顺序、NULL 属性、索引等不可控,删 MV 时表也跟着消失——这在生产环境极危险。
正确做法分两步:
CREATE TABLE your_table AS SELECT * FROM your_table@dblink WHERE 1=0;;CREATE MATERIALIZED VIEW your_table ON PREBUILT TABLE REFRESH FAST ON DEMAND WITH PRIMARY KEY AS SELECT * FROM your_table@dblink;。其中 BUILD IMMEDIATE 要加上,否则 MV 创建后为空;ENABLE QUERY REWRITE 可选,但加了才能让优化器自动走 MV,否则只是个“手动缓存表”。
调用刷新过程看似简单,但两个参数极易出错:
'F'(FAST)和 'C'(COMPLETE)必须大写;用全称时 'FAST' 和 'COMPLETE' 也区分大小写;'MV_A,MV_B',但总长度不能超 32 字节(Oracle 11g 限制);真正容易被忽略的是:跨库 REFRESH FAST 的底层依赖链非常脆弱——源库日志表(MLOG$_TABLENAME)必须对 DBLINK 用户可见,否则即使日志存在、DBLINK 可连,刷新也会静默退化为全量。