如何在pg_restore期间阻止物化视图刷新?

时间:2014-06-25 15:45:44

标签: postgresql materialized-views postgresql-9.3

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

我留下了4个进程。其中一个是物化视图的刷新,另外三个是应用于物化视图用作数据源的3个表的索引。索引根据pg_stat_activity“等待”,可能是因为物化视图的REFRESH仍在访问源表。

当索引到位时,视图的刷新只需要几分钟。由于在REFRESH期间索引不到位,我在17小时时将REFRESH进程关闭,这使得pg_restore失败。

我怎么能

  1. 强制执行项目的顺序,以便首先创建索引
  2. 关闭物化视图的刷新并稍后手动执行
  3. 以自定义格式处理转储文件以说“无数据”
  4. 拦截REFRESH MATERIALIZED VIEW语句并将其丢入垃圾箱
  5. 还是完成工作的任何其他解决方案?

3 个答案:

答案 0 :(得分:18)

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

"你有没有尝试过' -l(el)& -L' pg_restore的选项?

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

(使用示例位于页面底部)

基本上重新排序命令序列,以便实体化运行得很晚 尽可能,或者只是完全禁用它。

应该教会pg_dump / pg_restore更好地处理这个,这是主要的 为什么克雷格让你尽快在这里发布,但现在让它发挥作用 需要人工干预。在理论上,'列出'功能 应该让你做你需要的。"

我认为这个(pg_restore -l | pg_restore -L)会让我到达我需要的地方 现在通过插入一个小的shell脚本来推动它 物化视图到列表的末尾,但后来我也必须这样做 为我重新排序的项管理自己的依赖项(MatViews of 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的提示。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

pg_restore只能由架构使用。