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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:25