我使用“自定义”格式( pg_dump ) (-Fc)创建了数据库转储。这种格式允许使用“作业”选项(-j8)调用-j8。作业选项启动8个进程,并在10分钟内恢复数据库中的绝大多数关系。
我只剩下4个程序。其中一个是物化视图的刷新,另3个是应用于物化视图用作数据源的3个表的索引。根据pg_stat_activity,索引正在“等待”,大概是因为物化视图的REFRESH
仍在访问源表。
当索引到位时,视图的刷新只需几分钟。由于索引在REFRESH
期间没有到位,所以我在17小时内切断了REFRESH
进程,这导致pg_restore失败。
我怎样才能
REFRESH MATERIALIZED VIEW
语句并将其扔进回收站或者其他能完成任务的解决方案?
发布于 2014-06-26 16:02:49
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更好地处理这个问题,这也是Craig让您尽快在这里发布的主要原因,但是为了使它现在能够正常运行,手动干预是必要的。从理论上讲,‘列表’功能应该允许你做你需要的事情。“
我认为这(pg_restore -l pg_restore -L)将通过在中间插入一个小shell脚本(将物化视图推后到列表的末尾)来达到我现在需要的位置,但接下来我还必须管理我重新排序的项(MatViews of MatViews)的依赖项。这严重地限制了物化的观点对我的用处。对于9.3.x版本,我可能需要不超过1深度的MatView依赖。
编辑:为了停止恢复中的数据,我开始这样做:
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
语句。感谢大卫·G·约翰斯顿的建议。
发布于 2014-08-20 01:30:47
作为可接受答案的补充,一旦所有索引完成和/或运行了ANALYZE,您可以使用以下命令按正确(依赖)顺序刷新物化视图:
pg_restore -l -Fd backup_dir | grep 'MATERIALIZED VIEW DATA' > refresh.lst
pg_restore -L refresh.lst -Fd backup_dir mydatabase
发布于 2014-06-26 16:53:22
一个解决办法,你可以试试。
也许您可以在单独的模式中创建MatViews,专用于它们。为了向后兼容,您可以使用同义词。
pg_restore只能由架构使用。
https://stackoverflow.com/questions/24413161
复制相似问题