如何防止物化视图在 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 期间刷新?的主要内容,如果未能解决你的问题,请参考以下文章

红移物化视图刷新是不是会锁定基表?

物化视图快速刷新 - 更新基表时插入和删除

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

如何做到物化视图的自动刷新

了解 Google Bigquery 物化视图定价

Oracle设置物化视图的自动刷新