You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,提问作者Аушев

火山引擎 最新活动