You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清理Docker部署的Airflow配套Postgres的冗余数据?

清理Docker部署Airflow配套Postgres的base目录空间占用问题

1. 进入Postgres容器的命令行环境

因为是Docker部署,先连接到Postgres容器内部的psql工具:

docker exec -it <你的Postgres容器名或ID> psql -U airflow airflow

(注:默认Airflow的Postgres用户名和数据库名都是airflow,如果你的配置不同,替换成对应的值)

2. 识别base目录中数字OID对应的数据库对象

base目录里的数字文件名是Postgres对象(表、索引、TOAST表等)的OID,先搞清楚这些OID对应什么:
在psql中执行:

SELECT oid, relname, relkind FROM pg_class WHERE oid IN (16442, 16451);

把你看到的所有数字OID替换进去,relkind的含义:

  • r:普通表
  • i:索引
  • t:TOAST表(存储大字段的附属表)
  • v:视图

如果某个OID在pg_class中查不到,说明这个对象已经被删除,但Postgres可能因为活跃事务未结束还没清理对应的文件。

3. 用Postgres原生工具清理

轻量清理(不锁表,不释放磁盘到系统)

执行常规VACUUM回收死元组空间,适合日常维护:

VACUUM;

深度清理(释放磁盘空间,会锁表)

如果需要把空闲空间还给操作系统,执行VACUUM FULL,必须在业务低峰期操作,因为它会重建表并锁表:

VACUUM FULL;

4. 针对Airflow的专属清理(从源头减少数据堆积)

Airflow的任务实例、日志表是Postgres空间占用大户,直接清理这些历史数据更有效:

  • 用Airflow CLI清理旧数据,比如清理30天前的任务实例、日志等:
docker exec -it <你的Airflow容器名或ID> airflow db clean --clean-before-timestamp $(date -d "30 days ago" +%Y-%m-%dT%H:%M:%S)
  • 也可以修改airflow.cfg配置,开启自动清理:
    • 设置max_task_instance_history:保留的任务实例最大数量
    • 设置max_log_age_days:日志保留的天数
      改完配置后重启Airflow服务即可自动生效。

5. 清理废弃的OID文件

如果执行完VACUUM FULL后,base目录里还有无对应OID的文件,先确认没有活跃的长事务:
在psql中执行:

SELECT pid, query, state, xact_start FROM pg_stat_activity WHERE state = 'active';

如果没有长时间运行的活跃事务,停止Postgres容器后,可以删除这些无对应对象的文件,但强烈建议先备份整个postgres目录再操作。

注意事项

  • 清理前一定要备份Postgres数据:可以用pg_dump导出,或者直接备份Docker的postgres卷。
  • 定期维护:设置定时任务,每周执行一次VACUUM和Airflow的db clean,防止数据堆积。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:12:19