Camunda已完成/终止流程实例及变量清理方案咨询
清理Camunda已完成/终止流程的运行时数据方案
一、Camunda自动清理配置(长期预防)
即使历史级别设为0(HISTORY_NONE),Camunda默认不会自动清理运行时表中已结束流程的数据,需添加以下配置开启自动清理:
1. Spring Boot 项目配置(application.yml)
camunda.bpm.run: cleanup: enabled: true batch-window-start-time: "02:00" # 凌晨2点开始清理 batch-window-end-time: "04:00" # 凌晨4点结束 removal-time: "P7D" # 清理7天前已结束的流程数据
2. 传统部署(bpm-platform.xml)
<process-engine name="default"> <properties> <property name="runCleanupEnabled">true</property> <property name="cleanupBatchWindowStartTime">02:00</property> <property name="cleanupBatchWindowEndTime">04:00</property> <property name="cleanupRemovalTime">P7D</property> </properties> </process-engine>
removal-time支持ISO-8601格式,比如P30D表示30天前,P1M表示1个月前
二、手动清理SQL脚本(快速解决当前膨胀问题)
针对已存在的数百万条act_ru_variable数据,直接执行关联清理脚本,确保只删除已完成/终止的流程实例相关数据:
步骤1:备份数据
执行清理前务必备份相关表:act_ru_variable、act_ru_execution、act_ru_task、act_ru_identitylink、act_ru_job
步骤2:分批删除已结束流程的变量
-- MySQL语法:分批删除已完成/终止流程的变量,每次删1000条,避免锁表 WHILE EXISTS ( SELECT 1 FROM act_ru_variable var JOIN act_ru_execution exe ON var.execution_id_ = exe.id_ WHERE exe.end_time_ IS NOT NULL ) DO DELETE FROM act_ru_variable WHERE execution_id_ IN ( SELECT id_ FROM act_ru_execution WHERE end_time_ IS NOT NULL LIMIT 1000 ); COMMIT; END WHILE;
PostgreSQL需调整循环语法为LOOP...END LOOP,其他数据库根据自身语法适配
步骤3:清理其他关联的已结束流程运行时数据(可选,避免孤儿数据)
-- 删除已结束流程的执行实例 WHILE EXISTS (SELECT 1 FROM act_ru_execution WHERE end_time_ IS NOT NULL) DO DELETE FROM act_ru_execution WHERE end_time_ IS NOT NULL LIMIT 1000; COMMIT; END WHILE; -- 删除已结束流程的任务 WHILE EXISTS (SELECT 1 FROM act_ru_task WHERE execution_id_ NOT IN (SELECT id_ FROM act_ru_execution)) DO DELETE FROM act_ru_task WHERE execution_id_ NOT IN (SELECT id_ FROM act_ru_execution) LIMIT 1000; COMMIT; END WHILE; -- 删除已结束流程的身份链接 WHILE EXISTS (SELECT 1 FROM act_ru_identitylink WHERE task_id_ NOT IN (SELECT id_ FROM act_ru_task)) DO DELETE FROM act_ru_identitylink WHERE task_id_ NOT IN (SELECT id_ FROM act_ru_task) LIMIT 1000; COMMIT; END WHILE;
三、定期清理的替代方案
如果Camunda自带的自动清理不满足需求,可自定义定时任务:
- 用Spring的
@Scheduled注解编写定时任务,调用Camunda API查询已结束流程实例,再删除其变量及关联数据 - 用数据库定时任务(如MySQL事件、PostgreSQL定时任务)执行上述清理SQL
四、关键注意事项
- 测试验证:所有脚本先在测试环境执行,确认不会删除运行中流程的数据(运行中流程的
act_ru_execution.end_time_为NULL) - 分批执行:避免一次性删除大量数据导致数据库锁表或性能波动
- 监控:清理后监控数据库性能,确认
act_ru_variable表大小恢复正常,新流程运行性能提升
内容的提问来源于stack exchange,提问作者c.sankhala
相关产品推荐
相关产品推荐

