数据库导入后 Postgres autovacuum high cpu/disk

Posted

技术标签:

【中文标题】数据库导入后 Postgres autovacuum high cpu/disk【英文标题】:Postgres autovacuum high cpu/disk after database import 【发布时间】:2019-08-24 02:04:23 【问题描述】:

我已经将一个 2tb Postgres 9.4 数据库从一台服务器迁移到另一台服务器,导入后 autovacuum 因高 CPU 和磁盘而疯狂了好几天。该数据库有超过 40,000 个模式/表。

我已尝试关闭数据库并重新启动,但使用率仍然很高。 我之前在导入后遇到过真空问题,这似乎是 Postgres 的常见问题,有什么办法可以解决吗?导出的数据库没问题,没有vacuum问题,好像是导入引起的。

我试过了:

vacuumdb --all --full -w

但如果由于语句超时而未能完成。 除了禁用autovacuum,有什么解决办法吗?

【问题讨论】:

9.4 的小版本是什么? 对我来说,“导入”和“迁移”是不同的东西。你能解释一下你实际上做了什么吗?您是否使用pg_dump ...| psql ... 将来自两个不同集群的数据整合到一个集群中? "vacuumdb --all --full -w" --full 选项几乎可以肯定是一个错误。 从一个数据库导出,pg_dumpall,并导入到另一个 psql ... 所以“vacuumdb --all -w”更好?为什么? 【参考方案1】:

导入后数据库必须重新创建统计和可见性地图。所以这是预期的行为。如果您不手动运行VACUUM 或禁用了 autovacuum,那么 Postgres 将无法有效工作。

导出是读操作,不需要VACUUM。如果您导入 2TB 数据,那么在完成VACUUM 之前,预计 CPU 和 IO 会很高。您可以手动运行VACUUM(以更高的速度),但它不应该因为超时而失败(您应该增加超时)。

【讨论】:

在真空清理磁盘/cpu 的第 4 天之后,它终于安定下来了。请注意,我必须每天早上重新启动数据库,否则它会一直很高。 有没有办法不花 4 天?是否需要“vacuumdb --all --full -w”? @James - 4 天看起来太长了 - 也许有些是错误的 - Postgres 错误,IO 太慢,内存太少,......也许 40 000 个对象是 Vacuumdb 的问题,也许一些系统表是臃肿。 VACUUM 的速度很大程度上取决于索引的数量。如果您可以减少索引,那么您可以减少必要的时间。

以上是关于数据库导入后 Postgres autovacuum high cpu/disk的主要内容,如果未能解决你的问题,请参考以下文章

postgres导入其他数据库数据

如何将数据从 postgres 数据库导入到 android sqlite

如何将Postgres备份文件.backup导入到新的数据库中

Postgres 批量数据导入和填充相关数据

powershell 导入postgres数据库

如何从 Postgres 9.4 中转储大对象数据,然后将其导入 Postgres8.x?