是否可以在 Celery Task 中运行 VACUUM 命令?

问题描述 投票:0回答:2

我有 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?或者以某种方式禁用任务事务逻辑?

django postgresql transactions celery vacuum
2个回答
2
投票

一般来说,除非您刚刚进行了大量删除,否则通常不需要进行真空清理。只需确保 autovacuum 正在运行并已启用。它会在后台执行此操作,您无需担心。

其次,您可以启动系统命令来运行vacuumdb命令行工具。这将在单独的会话中完成。


0
投票

需要考虑的一些要点:

  1. 不幸的是,
    VACUUM
    无法在事务内执行。
  2. Django 默认行为是在自动提交模式下运行查询。
  3. 如果您的数据库表中经常出现死元组,您可以调整“Autovacuum 守护进程”。

手动运行

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"

更多参考:

© www.soinside.com 2019 - 2024. All rights reserved.