【问题标题】:ORA-06512 when creating materialized viewORA-06512 创建实体化视图时
【发布时间】:2021-05-31 20:10:50
【问题描述】:

我正在尝试在 Oracle 中创建一个 mview。这将是我每天运行的报告,所以我只需要在执行前按需更新它。

CREATE MATERIALIZED VIEW mv_test
    REFRESH
        ON DEMAND
AS
    SELECT
        zzcode,
        COUNT(1) c
    FROM
        cdc.uap_zufi_t_dca_place@rbip
    GROUP BY
        zzcode;
        
BEGIN
    dbms_snapshot.refresh('mv_test', 'f');
END;

但是,出现以下错误:

ORA-06512:在第 2 行 23413. 00000 - “表“%s”。“%s”没有物化视图日志” *原因:主表无法进行快速刷新 不包含物化视图日志。 *操作:使用 CREATE MATERIALIZED VIEW LOG 命令创建一个 主表上的物化视图日志。

【问题讨论】:

  • 错误信息的哪一部分让您感到困惑?它不仅告诉您问题所在,还提供解决问题所需的操作
  • 试试refresh on demand complete
  • 这个查询返回什么select refresh_mode, refresh_method from all_mviews where mview_name = 'MV_TEST'
  • 您需要在 mv 引用的表上创建 MATERIALIZED VIEW LOG,而不是在 mv 本身上。在您的情况下,这可能在 cdc.uap_zufi_t_dca_place@rbip
  • 我猜您需要登录到该源数据库才能创建该日志(或让具有适当权限的人为您执行此操作)。恐怕我不知道当源表在另一个数据库中时是否可以在一个数据库中创建一个 MV - 但我猜如果你阅读 Oracle 文档,它可能会告诉你。无论如何,如果您查看文档可能会是一个好主意

标签: sql oracle


【解决方案1】:

您确实应该使用dbms_mview 包而不是旧的dbms_snapshot。他们在这种情况下做同样的事情,但 Oracle 甚至不再费心记录 dbms_snapshot 包。

dbms_mview.refresh 的第二个参数是method。您指定的 method 为 'f',这意味着您要求快速(增量)刷新。如果您想要增量刷新,您需要在远程数据库上创建一个物化视图日志(您几乎可以肯定无法通过数据库链接执行此操作)。或者,您可以要求完全刷新,但每次都要通过网络发送每一行

begin
  dbms_mview.refresh( 'MV_TEST', 'c' );
end;

【讨论】:

  • 或者将参数留空以使用默认刷新方法,无需猜测 MV 是如何设计的
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多