我发现我的postgresql数据库行为怪异。昨天磁盘已满,数据库大小约为140 GB。我将其扩展了20 GB,以便在linux拒绝执行任何操作时进行故障排除。我列出了数据库,rtsm为108 GB,而且/var/lib/pgsql/13/data/base已满,包含的文件最大为1GB。
rtsm | rtsm | UTF8 | en_ZM.UTF-8 | en_ZM.UTF-8 | =Tc/rtsm +| 108 GB | pg_default |
问题是当我列出表时,我找不到任何一个使用太多空间的表,最大的一个像800 MB。
我错过什么了吗?
PS:我使用了VACUUM操作来回收空间,我知道它不适合我的情况。
1条答案
按热度按时间ffx8fchx1#
有几件事要检查。
1.表可以累积死行。Vacuum只会将这些行标记为可重用。所有死行的结束页将返回给操作系统。因此,您不会总是以这种方式要求空间。扩展pgstattuple非常擅长显示此信息。它扫描所有页,因此可能会占用大量资源。Vacuum full将重写表,删除所有死空间。但是这会在一段时间内锁定它。2扩展pg_repack将执行此操作并维护访问。3这两个都是资源密集型的。
1.索引膨胀。这实际上与上面的相同。pgstattuple将显示关于它们的相同信息。重新索引将回收它们内部的死空间。