Postgresql 博士后:“;“真空”;命令不会清除死元组

Postgresql 博士后:“;“真空”;命令不会清除死元组,postgresql,vacuum,Postgresql,Vacuum,我们在Amazon RDS中有一个postgres数据库。最初,我们需要快速加载大量数据,因此根据需要关闭了autovacuum。最近,我在运行查询时注意到一些性能问题。然后我意识到它已经很久没有被吸尘了。事实证明,很多表都有很多死元组 令人惊讶的是,即使我在一些表上手动运行了vacuum命令,它似乎也没有删除这些死元组完全真空需要很长时间才能完成,通常会在一整晚后超时 为什么真空命令不起作用?我的其他选项是什么,重新启动实例?解释了为什么不删除所有死元组 对于vacuum full不超时,设

我们在Amazon RDS中有一个postgres数据库。最初,我们需要快速加载大量数据,因此根据需要关闭了
autovacuum
。最近,我在运行查询时注意到一些性能问题。然后我意识到它已经很久没有被吸尘了。事实证明,很多表都有很多死元组

令人惊讶的是,即使我在一些表上手动运行了
vacuum
命令,它似乎也没有删除这些死元组<代码>完全真空需要很长时间才能完成,通常会在一整晚后超时

为什么
真空
命令不起作用?我的其他选项是什么,重新启动实例?

解释了为什么不删除所有死元组

对于
vacuum full
不超时,设置
语句\u timeout=0

建议在数据库还原时禁用autovacuum,此外,他们明确建议使用它:

重要的

不运行自动真空可能导致最终需要的停机 执行更具侵入性的真空操作

取消所有会话和清空表应该有助于处理以前的死元组(关于重新启动集群的建议)。但我建议你首先做的是打开自动真空。最好控制表上的真空,而不是使用
autovacuum\u vacuum\u threshold
,(
ALTER table
)参考这里:

使用
vacuum(VERBOSE)
获得它正在做什么以及为什么要做的详细统计信息

无法删除死元组的原因有三个:

  • 有一个长时间运行的事务尚未关闭。你可以找到那些带着

    SELECT pid, datname, usename, state, backend_xmin
    FROM pg_stat_activity
    WHERE backend_xmin IS NOT NULL
    ORDER BY age(backend_xmin) DESC;
    
    您可以通过取消交易

  • 存在尚未提交的已准备交易记录。你可以找到他们与

    SELECT gid, prepared, owner, database, transaction
    FROM pg_prepared_xacts
    ORDER BY age(transaction) DESC;
    
    SELECT slot_name, slot_type, database, xmin
    FROM pg_replication_slots
    ORDER BY age(xmin) DESC;
    
    用户或单击以关闭它们

  • 有一些是不被使用的。找到他们

    SELECT gid, prepared, owner, database, transaction
    FROM pg_prepared_xacts
    ORDER BY age(transaction) DESC;
    
    SELECT slot_name, slot_type, database, xmin
    FROM pg_replication_slots
    ORDER BY age(xmin) DESC;
    
    用于删除未使用的复制插槽


  • 总是有一个蛮力选项:1)创建一个新表,2)从旧表复制数据,3)删除旧表,4)将新表重命名为旧名称。对于每一个有很多死行的表都会重复。我认为amazon建议只在数据库恢复时禁用autovacuum。。。通常,禁用自动真空只会带来问题。它甚至在你的链接中说:“重要的是,不运行autovacuum可能会导致最终所需的中断,以执行更具侵入性的真空操作…”因此,如果
    真空完全
    超时,请将statement_timeout设置为zero,我就能够在终止事务后删除所有死元组。为什么我有这么多活生生的元组呢?他们做了什么吗?是的,他们是你表格中的数据。经过
    VACUUM
    之后,表中的行数应该与活动元组的数量相同。