【问题标题】:How can I prevent materialized views from refreshing during pg_restore?如何防止物化视图在 pg_restore 期间刷新?
【发布时间】:2014-08-16 06:45:29
【问题描述】:

我使用“自定义”格式 (-Fc) 的 pg_dump 创建了数据库转储。这种格式允许使用“jobs”选项(-j8)调用 pg_restore。作业选项启动 8 个进程,并在 10 分钟内恢复我数据库中的绝大多数关系。

我剩下 4 个进程。其中之一是物化视图的刷新,另外 3 个是要应用于物化视图用作数据源的 3 个表的索引。根据pg_stat_activity,索引处于“等待”状态,大概是因为物化视图的REFRESH仍在访问源表。

索引到位后,视图的刷新只需几分钟。因为REFRESH期间索引没有到位,所以我在17小时关闭了REFRESH进程,导致pg_restore失败。

我该怎么做

  1. 强制项目的顺序,以便首先创建索引
  2. 关闭物化视图的刷新,稍后手动进行
  3. 以自定义格式操作转储文件以显示“没有数据”
  4. 截取REFRESH MATERIALIZED VIEW语句并扔进垃圾桶

或者任何其他可以完成工作的解决方案?

【问题讨论】:

  • 请尽快在 pgsql-hackers 邮件列表中报告此问题。链接到这个问题,也描述问题。如果方便的话,通过archives.postgresql.org 链接到您的帖子会很棒。
  • 好的,做到了。感谢您的建议。

标签: postgresql materialized-views postgresql-9.3


【解决方案1】:

作为已接受答案的补充,一旦所有索引都已完成和/或您已运行 ANALYZE,您可以使用以下命令以正确(依赖)顺序刷新物化视图:

pg_restore -l -Fd backup_dir | grep 'MATERIALIZED VIEW DATA' > refresh.lst
pg_restore -L refresh.lst -Fd backup_dir mydatabase

【讨论】:

    【解决方案2】:

    David G Johnston posted an answer for me on the pgsql-hackers mailing list.

    “有/可以尝试 pg_restore 的 '-l (el) & -L' 选项吗?

    http://www.postgresql.org/docs/9.3/static/app-pgrestore.html

    (使用示例在页面底部)

    基本上重新排序命令序列,以便物化运行较晚 尽可能,或者完全禁用它。

    应该教 pg_dump/pg_restore 更好地处理这个问题,这是主要的 克雷格让你尽快在这里发帖的原因,但现在让它发挥作用 需要人工干预。理论上“上市”能力 应该允许你做你需要的。”

    我认为这 (pg_restore -l | pg_restore -L) 将把我带到我需要的地方 现在通过在中间插入一个小的 shell 脚本来推动 物化视图到列表的末尾,但我也将不得不 为我重新排序的项目管理我自己的依赖项(MatViews 垫视图)。 这非常严重地限制了物化视图对我的有用性。 对于 9.3.x 版本,我可能需要 MatView 依赖项不超过 1 深。

    编辑: 为了停止在还原时实现数据,我开始这样做:

    pg_dump mydatabase -Fd backup_dir
    pg_restore -l  -Fd backup_dir | sed '/MATERIALIZED VIEW DATA/d' > ordered.lst
    pg_restore -L ordered.lst -Fd backup_dir mydatabase
    

    这会从还原中删除 REFRESH MATERIALIZED VIEW 语句。 感谢 David G Johnston 提供的提示。

    【讨论】:

      【解决方案3】:

      一种解决方法,你可以试试。

      也许您可以在单独的模式中创建 MatViews,专用于它们。 为了向后兼容,您可以使用同义词。

      pg_restore 只能被模式使用。

      【讨论】:

      • 通过从主 pg_dump 中排除 mat 视图的模式,并在单独的步骤中转储它们,这可能会更有帮助。但是,这个两步过程需要改造旨在为多个数据库提供服务的备份脚本。
      • 没错,我希望他们能修复 pg_restore。 :)
      猜你喜欢
      • 1970-01-01
      • 2015-10-10
      • 2018-04-11
      • 2010-09-27
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2021-10-14
      相关资源
      最近更新 更多