我有 celery 周期性任务,需要在每次运行后运行 postgres VACUUM 查询,否则该任务会占用大量 HDD 空间。
我尝试最后在任务内部运行 VACUUM,但出现错误:
DatabaseError: VACUUM cannot run inside a transaction block
我尝试应用
@transaction.commit_manually
装饰器并在调用 VACUUM 之前执行 transaction.commit()
,但收到此错误:
TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK
有没有办法在芹菜任务中执行VACUUM?或者以某种方式禁用任务事务逻辑?
一般来说,除非您刚刚进行了大量删除,否则通常不需要进行真空清理。只需确保 autovacuum 正在运行并已启用。它会在后台执行此操作,您无需担心。
其次,您可以启动系统命令来运行vacuumdb命令行工具。这将在单独的会话中完成。
需要考虑的一些要点:
VACUUM
无法在事务内执行。手动运行
VACUUM ANALYZE
(清理并向数据库规划器报告统计信息)并不常见。
如果您对可能的死元组感到好奇,您可以运行
ANALYZE
,并首先观察数据库表是否确实充满了死元组:
psql -h 127.0.0.1 -U postgres -c "ANALYZE VERBOSE" 2>&1 | grep -E --color "[1-9][1-9]? dead rows"
更多参考: