我使用“自定义”格式(-Fc)的pg_dump创建了数据库转储。此格式允许使用“jobs”选项(-j8)调用pg_restore。作业选项启动8个进程,并在10分钟内恢复数据库中的绝大多数关系。
我留下了4个进程。其中一个是物化视图的刷新,另外三个是应用于物化视图用作数据源的3个表的索引。索引根据pg_stat_activity“等待”,可能是因为物化视图的REFRESH
仍在访问源表。
当索引到位时,视图的刷新只需要几分钟。由于在REFRESH
期间索引不到位,我在17小时时将REFRESH
进程关闭,这使得pg_restore失败。
我怎么能
REFRESH MATERIALIZED VIEW
语句并将其丢入垃圾箱还是完成工作的任何其他解决方案?
答案 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只能由架构使用。