如何清理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
相关产品推荐
相关产品推荐

