ClickHouse数据迁移报错后内存未自动释放,能否手动释放?
ClickHouse内存未释放问题求助
执行数据迁移SQL
INSERT INTO data_center.local_table SELECT * FROM data_center.base_table where create_time >= 1667664000 AND create_time < 1667750400时触发MEMORY_LIMIT_EXCEEDED错误(版本21.8.2,错误码241),之后内存未自动释放,通过clickhouse-client查询system.asynchronous_metrics指标,发现OSMemoryAvailable始终无法回升,请问是否可以手动释放内存?
可行的手动内存释放方法
可以手动触发内存释放,针对21.8.2版本,推荐以下操作:
- 触发强制垃圾回收:在clickhouse-client中执行
SYSTEM FORCE GC;命令,该命令会强制ClickHouse执行垃圾回收,回收未被自动释放的内存块。 - 终止残留任务:查询
system.processes表找到与本次迁移相关的残留进程,执行KILL QUERY WHERE query LIKE '%INSERT INTO data_center.local_table%';命令终止任务,避免内存被无效进程占用。 - 重启ClickHouse服务:若上述方法无效,可重启ClickHouse实例,这是最彻底的内存释放方式,但会中断当前所有业务,需在业务低峰期操作。
额外建议
- 21.8.2版本的内存回收机制存在一定局限性,建议后续升级到更高版本(如22.x及以上),新版本优化了内存管理逻辑,能减少此类内存泄漏问题。
- 执行大体积数据迁移时,可临时调整
max_memory_usage参数提升内存限制,或拆分任务按时间分片分批迁移,避免触发内存超限错误。
内容的提问来源于stack exchange,提问作者user1648059
相关产品推荐
相关产品推荐

