如何防止物化视图在 pg_restore 期间刷新?
Posted
技术标签:
【中文标题】如何防止物化视图在 pg_restore 期间刷新?【英文标题】:How can I prevent materialized views from refreshing during 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失败。
我该怎么做
-
强制项目的顺序,以便首先创建索引
关闭物化视图的刷新,稍后手动进行
以自定义格式操作转储文件以显示“没有数据”
截取
REFRESH MATERIALIZED VIEW
语句并扔进垃圾桶
或者任何其他可以完成工作的解决方案?
【问题讨论】:
请尽快在 pgsql-hackers 邮件列表中报告此问题。链接到这个问题,也描述问题。如果方便的话,通过archives.postgresql.org 链接到您的帖子会很棒。 好的,做到了。感谢您的建议。 【参考方案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。 :)以上是关于如何防止物化视图在 pg_restore 期间刷新?的主要内容,如果未能解决你的问题,请参考以下文章