Kir*_*bal 23 postgresql materialized-views postgresql-9.3
我使用"自定义"格式(-Fc)的pg_dump创建了数据库转储.此格式允许使用"jobs"选项(-j8)调用pg_restore.作业选项启动8个进程,并在10分钟内恢复数据库中的绝大多数关系.
我留下了4个进程.其中一个是物化视图的刷新,另外三个是应用于物化视图用作数据源的3个表的索引.索引根据pg_stat_activity"等待",可能是因为REFRESH物化视图仍在访问源表.
索引到位后,视图的刷新只需几分钟.因为索引在这期间没有到位,所以REFRESH我REFRESH在17小时后关闭了这个过程,这使得pg_restore失败了.
我怎么能够
REFRESH MATERIALIZED VIEW声明并将其扔进垃圾桶或任何其他完成工作的解决方案?
Kir*_*bal 21
David G Johnston在pgsql-hackers邮件列表上为我发布了一个答案.
"有/你可以尝试'-l(el)&-L'选项到pg_restore吗?
http://www.postgresql.org/docs/9.3/static/app-pgrestore.html
(使用示例位于页面底部)
基本上重新排序命令序列,以便尽可能延迟实现,或者只是完全禁用它.
应该教会pg_dump/pg_restore更好地处理这个问题,这是Craig让你在这里尽快发布的主要原因,但是为了让它现在起作用,人工干预将是必要的.理论上,"列表"功能应该可以让你做你需要的."
我认为这个(pg_restore -l | pg_restore -L)将通过在中间插入一个小的shell脚本将物化视图推送到列表的末尾来获取我现在需要的地方,但是我还需要管理我自己依赖于我重新排序的项目(MatViews的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
Run Code Online (Sandbox Code Playgroud)
这REFRESH MATERIALIZED VIEW将从还原中删除语句.感谢David G Johnston的提示.
小智 5
作为已接受答案的附录,一旦所有索引完成和/或运行 ANALYZE,您可以使用以下命令以正确的(依赖项)顺序刷新物化视图:
pg_restore -l -Fd backup_dir | grep 'MATERIALIZED VIEW DATA' > refresh.lst
pg_restore -L refresh.lst -Fd backup_dir mydatabase
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4196 次 |
| 最近记录: |