ClickHouse重启后ALTER TABLE DELETE任务触发MEMORY_LIMIT_EXCEEDED错误的排查与解决
解决ClickHouse重启后未完成Mutation任务导致OOM的问题
你遇到的情况是ClickHouse的典型问题:执行ALTER TABLE DELETE这类mutation操作时因内存不足崩溃,重启后ClickHouse会自动尝试恢复未完成的mutation任务,进而再次触发内存超限。下面是具体的解决步骤:
1. 先停止ClickHouse服务
首先得把反复尝试执行失败任务的ClickHouse停掉,避免持续触发OOM:
sudo systemctl stop clickhouse-server # 如果用其他启动方式(比如直接运行二进制),找到对应进程kill即可
2. 删除未完成的Mutation任务文件
ClickHouse的mutation任务会存在对应表的数据目录下,找到目标表的mutations文件夹:
# 替换成你的库名和表名,比如default.orders的默认路径如下: cd /var/lib/clickhouse/data/default/orders/mutations/
你会看到和日志中匹配的任务文件(比如mutation_202008_87744_112785_8339_964654),删除该任务的所有相关文件:
rm -rf mutation_202008_87744_112785_8339_964654*
注意:操作前请确认文件对应你要终止的失败任务,别误删其他正常的mutation文件,建议先备份该目录。
3. 调整内存配置(可选但推荐)
为了避免重启后执行其他任务再次OOM,临时调整ClickHouse的内存限制:
- 编辑
/etc/clickhouse-server/config.xml(或对应配置文件),修改全局内存参数:
<total_memory_limit>16GiB</total_memory_limit> <!-- 根据服务器总内存调整,比如32G内存可设20G左右 --> <mutate_memory_limit>8GiB</mutate_memory_limit> <!-- 单个mutation任务的内存上限 -->
- 或者在
users.xml中给default用户单独调整内存:
<users> <default> <max_memory_usage>12GiB</max_memory_usage> </default> </users>
4. 重启ClickHouse并验证
启动服务:
sudo systemctl start clickhouse-server
查看日志确认没有再出现MEMORY_LIMIT_EXCEEDED错误:
tail -f /var/log/clickhouse-server/clickhouse-server.log
后续优化建议
- 如果是大表数据删除,优先使用分区级删除:如果你的表按时间等字段分区,用
ALTER TABLE orders DROP PARTITION '202008';比全表DELETE高效得多,不会触发全表扫描式的mutation。 - 执行
DELETE前临时调高内存限制:先运行SET max_memory_usage = 16GiB;再执行删除操作,完成后改回原配置。 - 定期清理无用的mutation任务,避免任务积累占用资源。
内容的提问来源于stack exchange,提问作者Аушев




