如何解决Airflow无法分配数据库对象空间及调度器异常问题
Airflow调度器启动失败排查与解决
问题情况
- Airflow页面提示:
调度器似乎未运行,最后一次心跳是6小时前。DAG列表可能无法更新,新任务将不会被调度 - 已清理服务器日志文件夹、恢复磁盘空间,但执行
airflow scheduler时仍报错,错误核心是SQL Server的airflow数据库PRIMARY文件组已满,具体错误信息如下:
[2023-02-10 21:10:54,079] {cli_action_loggers.py:105} WARNING - Failed to log action with (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]无法为数据库 'airflow' 中的对象 'dbo.log'.'PK__log__3213E83F7F1F073F' 分配空间,因为 'PRIMARY' 文件组已满。请通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或启用现有文件的自动增长来创建磁盘空间。 (1105) (SQLExecDirectW)") [SQL: INSERT INTO log (dttm, dag_id, task_id, event, execution_date, owner, extra) OUTPUT inserted.id VALUES (?, ?, ?, ?, ?, ?, ?)] [parameters: (datetime.datetime(2023, 2, 10, 21, 10, 54, 51696, tzinfo=Timezone('UTC')), None, None, 'cli_scheduler', None, 'root', '{"host_name": "plappnx-1", "full_command": "[\'/usr/local/bin/airflow\', \'scheduler\']"}')] sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]无法为数据库 'airflow' 中的对象 'dbo.job'.'PK__job__3213E83F7D216A15' 分配空间,因为 'PRIMARY' 文件组已满。请通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或启用现有文件的自动增长来创建磁盘空间。 (1105) (SQLExecDirectW)") [SQL: INSERT INTO job (dag_id, state, job_type, start_date, end_date, latest_heartbeat, executor_class, hostname, unixname) OUTPUT inserted.id VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)] [parameters: (None, <TaskInstanceState.RUNNING: 'running'>, 'SchedulerJob', datetime.datetime(2023, 2, 10, 21, 10, 54, 981528, tzinfo=Timezone('UTC')), None, datetime.datetime(2023, 2, 10, 21, 10, 54, 981540, tzinfo=Timezone('UTC')), 'SequentialExecutor', 'plappnx-1', 'root')]
解决步骤
1. 检查数据库空间使用情况
登录SQL Server管理工具(SSMS或sqlcmd),执行以下命令查看airflow数据库的空间占用:
USE airflow; EXEC sp_spaceused;
重点看data部分的reserved和free字段,确认PRIMARY文件组是否真的没有剩余空间。
2. 清理Airflow的历史数据
Airflow的log和job表是主要的空间占用大户,清理旧数据:
- 删除30天前的日志和任务记录(可根据实际需求调整天数):
DELETE FROM dbo.log WHERE dttm < DATEADD(day, -30, GETUTCDATE()); DELETE FROM dbo.job WHERE start_date < DATEADD(day, -30, GETUTCDATE());
- 清理后如果需要回收空间,执行收缩数据库:
USE airflow; DBCC SHRINKDATABASE (airflow);
3. 开启数据库文件自动增长
如果数据库文件的自动增长被禁用或增量设置过小,修改配置:
- 用SQL命令调整:
ALTER DATABASE airflow MODIFY FILE (NAME = airflow_data, FILEGROWTH = 1024MB); -- 每次自动增长1GB,根据磁盘情况调整
- 或者在SSMS中操作:右键airflow数据库 → 属性 → 文件 → 找到PRIMARY数据文件,点击编辑按钮开启自动增长并设置合理增量。
4. 给PRIMARY文件组添加新数据文件
如果当前磁盘还有剩余空间,可添加新的数据文件扩容:
ALTER DATABASE airflow ADD FILE ( NAME = airflow_data2, FILENAME = 'D:\SQLData\airflow_data2.ndf', -- 替换为实际可用的磁盘路径 SIZE = 1024MB, FILEGROWTH = 1024MB ) TO FILEGROUP PRIMARY;
5. 重启调度器
完成以上操作后,重新启动Airflow调度器:
airflow scheduler
再检查Airflow页面的调度器状态是否恢复正常。
内容的提问来源于stack exchange,提问作者obautista
相关产品推荐
相关产品推荐

