将 PostgreSQL 11 备份恢复到 12 次挂起。我该如何调试它?

Restoring PostgreSQL 11 backup to 12 hangs. How can I debug it?

我正在尝试使用 the copy method 将 heroku PostgreSQL 实例从 pg11 升级到 pg12,因为我的测试环境是在业余爱好实例上。在该过程结束时,它似乎挂了很长时间(对于 120MB 的数据库,>30 分钟后不会退出)。数据存储区视图表明一切正常,我有相同数量的行,但存在问题。

这似乎是物化视图的错误。如果我连接到数据库并查看表和视图,只有一个似乎是空的。使用 postico,它等待并等待视图的结构,但不会对 unpopulated 视图发出通常的警告。

我可以通过创建本地 pg12 数据库并尝试将 pg_restore 与最近的备份一起使用来重现停顿行为。按照同样的思路,我似乎能够通过创建一个空的本地数据库、运行 所有数据库迁移、截断所有表和序列,然后从相同的数据库执行 --data-only --disable-triggers 加载来使其工作备份。不是一个特别顺利或鼓舞人心的迁移计划计划。使用 --verbose 没有显示任何明显的错误,我得到的最后一件事是它正在创建有问题的物化视图。

我还将 log_statement 设置为 all,我得到的最后一个是它正在刷新有问题的视图。此时postgres命令开始使用~100% CPU.

在本地,我正在使用此命令来恢复:

pg_restore --verbose --clean --no-acl --no-owner -h localhost -d database_name database_backup.dump

这是我们经常用来为本地开发恢复生产备份的命令。

从 11 升级到 12 时是否有任何已知陷阱,或者我可以通过哪些方式提取有关正在发生的事情的更多信息?

由于启动刷新时缺少统计数据,它可能选择了一个可怕的计划来执行实体化视图查询。

您可以终止该进程,然后在收集到统计信息后重新开始刷新(它们可能已经收集到了。)

如果从头开始,您可以 运行 pg_restore 和 pre-data 中的 --sectiondata,然后进行分析,然后进行 post-data.