数据库导入后 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 数据库导入到 android sqlite