【问题标题】:Run postgres VACUUM inside celery task在 celery 任务中运行 postgres VACUUM
【发布时间】:2013-10-09 01:56:54
【问题描述】:

我有 celery 周期性任务,需要在每次运行后运行 postgres VACUUM 查询,否则这个任务会占用大量硬盘空间。

最后我尝试在任务中运行 VACUUM,但出现错误:

DatabaseError: VACUUM cannot run inside a transaction block

我尝试在调用 VACUUM 之前应用 @transaction.commit_manually 装饰器并执行 transaction.commit(),但收到此错误:

TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

有没有办法在 celery 任务中执行 VACUUM ?或者以某种方式禁用任务事务逻辑?

【问题讨论】:

  • 如果它占用了磁盘空间,可能是因为它需要它(mvcc 的磁盘页面拆分等)...当您多次运行类似的事务时它是否仍然占用额外的空间?
  • 是的,没有 VACUUM。关于向具有巨大文本字段的表插入新行的问题。这就是我的任务。

标签: django postgresql celery vacuum


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 2015-10-24
    • 2014-04-02
    • 2020-06-30
    • 1970-01-01
    • 2011-09-15
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多