删除分区历史消息是什么
kafka-delete-records.sh 按分区把日志的低水位(log start offset)推进到指定位移:该位移之前的记录对消费者不可见,完全落在其之前的日志段会被删除,磁盘空间按段释放。它用于清理误灌数据或紧急释放磁盘,属于不可恢复操作——没有备份的地方,删掉就没了。与按时间保留策略不同,它不等待过期,立即生效。
基本信息
| 输入格式 | JSON 文件:version 与 partitions 数组(topic、partition、offset) |
|---|---|
| 语义 | 删除小于指定 offset 的所有记录,并推进低水位 |
| 生效范围 | 完全位于该位移之前的日志段;段内未被覆盖的部分仍保留 |
| 限制 | 目标位移不能超过高水位,否则请求失败 |
| 影响 | 消费者若从更早的位移读取会报越界(OffsetOutOfRange) |
| 恢复难度 | 不可逆,删除前无法通过工具恢复 |
典型使用场景
- 误灌数据清理:测试数据或错误格式的数据被写入生产主题,需要立即清掉
- 磁盘告急应急:保留策略来不及释放,用推进低水位的方式快速回收空间
- 敏感数据处置:误写入的敏感信息需要尽快从可读范围内移除
- 重放范围控制:把重放起点抬高,避免消费者读到已失效的历史数据
- 主题复用前清理:同一主题在切换用途前清空旧数据
删除指定分区历史消息
删除指定分区历史消息
# 1) 写 JSON:注意 offset 语义是「删除小于该位移的记录」
cat > delete.json <<'EOF'
{"version": 1, "partitions": [{"topic": "orders", "partition": 0, "offset": 500}]}
EOF
# 2) 执行前先确认当前低水位与高水位,避免删多
kafka-run-class.sh kafka.tools.GetOffsetShell \
--bootstrap-server localhost:9092 --topic orders --time -2
# 3) 执行删除,工具会返回推进后的低水位
kafka-delete-records.sh --bootstrap-server localhost:9092 \
--offset-json-file delete.json
# 4) 复核:新的低水位应等于或接近请求位移
kafka-run-class.sh kafka.tools.GetOffsetShell \
--bootstrap-server localhost:9092 --topic orders --time -2删前检查清单
| 检查项 | 为什么查 | 风险 |
|---|---|---|
| 消费组当前位点 | 确认没有活跃消费者需要这段数据 | 活跃消费者下次拉取直接跳到新低水位,出现数据空缺 |
| 是否需求重放 | 补数与回放常依赖历史消息 | 删除后无法重放,只能从源端重新导入 |
| 主题清理策略 | compact 主题删除效果受压实策略影响 | 误以为已清除,实际旧值仍在段内 |
| 是否多副本 | 删除会同步到所有副本 | 无法通过其他副本找回数据 |
| 请求位移是否合理 | 过大可能超过高水位直接失败 | 位移语义理解错,删多了真实业务数据 |
删除前务必确认没有消费者需要重放这段数据。对活跃消费组推进低水位,消费者下次拉取会直接跳到新低水位,产生难以察觉的数据空缺。
删除是按日志段生效的:只有完全位于目标位移之前的段文件会被删除,因此磁盘回收量以段为单位。请求位移极小或落在段中间时,实际释放的空间可能与预期不符。