Airflow 2.3.3(GCP Composer)db clean未清理dag_runs表,是否为已知问题?
问题
在GCP Composer环境使用Airflow 2.3.3版本,执行airflow db clean命令后,发现dag_runs等元数据表中的部分条目未被清理,手动检查数据库确认这些条目仍存在。执行以下SQL语句查询到非空结果:
SELECT base.* FROM dag_run AS base LEFT OUTER JOIN (SELECT dag_id, max(dag_run.start_date) AS max_date_per_group FROM dag_run WHERE external_trigger = false GROUP BY dag_id) AS latest ON base.dag_id = latest.dag_id AND base.start_date = max_date_per_group WHERE base.start_date < '2023-01-01' AND max_date_per_group IS NULL;
请问这是已知问题吗?
解答
- 这是Airflow 2.3.x版本
airflow db clean命令的预期行为,部分场景下易被误认为清理不彻底,核心原因包括:- 默认保留每个DAG的最新运行记录:该命令的逻辑是为每个DAG保留最新的一次运行实例,无论其开始时间是否早于清理阈值。你的SQL结果中可能包含部分DAG的唯一运行记录(即该DAG无后续运行),这类记录会被命令跳过。
- 外部触发任务的处理规则:从SQL可以看出,结果集包含
external_trigger = true的dag_run。Airflow 2.3.3中,db clean默认保留外部触发任务的最新运行实例,这由airflow.cfg的clean_keep_last参数控制(默认值True),即使该实例早于阈值也不会被清理。 - 版本固有局限:2.3.x版本的
db clean确实存在边缘场景处理不足的问题,比如已删除DAG的历史记录无法自动清理、多租户环境下权限隔离导致的清理遗漏等,这些问题在2.4及以上版本中已得到优化。
若需要彻底清理所有早于指定日期的dag_runs(包括每个DAG的最新记录),可修改命令参数执行:
airflow db clean --clean-keep-last False --before 2023-01-01
也可通过自定义SQL批量删除目标条目,但执行前必须做好数据库备份。
内容的提问来源于stack exchange,提问作者Miroslav Karpíšek
相关产品推荐
相关产品推荐

