如何在pg_restore期间阻止物化视图刷新?

Kir*_*bal 23 postgresql materialized-views postgresql-9.3

我使用"自定义"格式(-Fc)的pg_dump创建了数据库转储.此格式允许使用"jobs"选项(-j8)调用pg_restore.作业选项启动8个进程,并在10分钟内恢复数据库中的绝大多数关系.

我留下了4个进程.其中一个是物化视图的刷新,另外三个是应用于物化视图用作数据源的3个表的索引.索引根据pg_stat_activity"等待",可能是因为REFRESH物化视图仍在访问源表.

索引到位后,视图的刷新只需几分钟.因为索引在这期间没有到位,所以REFRESHREFRESH在17小时后关闭了这个过程,这使得pg_restore失败了.

我怎么能够

  1. 强制项的顺序,以便首先创建索引
  2. 关闭实体化视图的刷新并稍后手动完成
  3. 以自定义格式操作转储文件以说"没有数据"
  4. 拦截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)