TiKV 未释放空间的原因
1)SST import 临时文件
路径
/data1/tidb-data/tikv-20160/import
里面会有:
.temp
.sst
这些是 restore 过程产生的。
如果 restore 中断:
不会自动清理。
2)删除库只是逻辑删除
你执行了:
drop database
但:
数据不会立即删除
因为 TiDB 是:
MVCC + GC 回收
删除后:
数据进入:
GC 等待阶段
只有 GC 后才真正释放。
3)GC 停在凌晨
你说:
gc时间停在凌晨
说明:
GC 没推进
检查:
mysql.tidb
看:
tikv_gc_safe_point
可能停住了。
例如:
2024-04-08 02:00
一直不动。
那么:
drop 的库不会被清理
磁盘自然不释放。
4)Region 不均衡
restore 过程中:
大量 SST 导入
会产生:
大量 Region
如果 restore 中断:
调度不完整。
就会出现:
某些 tikv 写入大量数据
某些 tikv 很少
磁盘不均衡。
现在正确处理方案
按顺序执行。
不要跳步骤。
第一步:检查 GC 状态
执行
select * from mysql.tidb where variable_name like ‘tikv_gc%’;
重点看
tikv_gc_enable
tikv_gc_run_interval
tikv_gc_safe_point
正常应该类似:
tikv_gc_enable = true
tikv_gc_run_interval = 10m
tikv_gc_safe_point = 当前时间 - 1h
如果 safe_point 不动。
说明 GC 卡住。
第二步:手动推进 GC
执行
update mysql.tidb
set variable_value=‘10m’
where variable_name=‘tikv_gc_run_interval’;
然后:
update mysql.tidb
set variable_value=‘true’
where variable_name=‘tikv_gc_enable’;
再看
tikv_gc_safe_point
是否推进。
也可以直接触发:
gc
方法:
set global tidb_gc_run_interval=‘5m’;
等待 10 分钟。
观察:
tikv 磁盘
是否下降。
第三步:清理 Import 目录
进入每个 tikv
cd /data1/tidb-data/tikv-20160/import
查看
ls
如果有:
.temp
.sst
可以清理。
但注意:
必须确认没有 restore 在运行
检查
ps -ef | grep br
确认没有。
然后:
rm -rf import/.temp/*
以及
rm *.sst
这样可以立刻释放大量空间。
第四步:检查 Region 分布
执行
pd-ctl store
看
capacity
available
region_count
如果出现:
某个 tikv region 特别多
说明不均衡。
第五步:开启调度
执行
pd-ctl config show
看:
region-schedule-limit
leader-schedule-limit
建议:
region-schedule-limit = 2048
leader-schedule-limit = 64
临时提升:
pd-ctl config set region-schedule-limit 2048
pd-ctl config set leader-schedule-limit 64
pd-ctl config set replica-schedule-limit 64
让 PD 重新均衡。
第六步:检查 GC life time
执行
show variables like ‘tidb_gc_life_time’;
如果是:
24h
说明:
删除数据需要等 24 小时。
可以临时改成:
10m
set global tidb_gc_life_time=‘10m’;
然后等待 GC。
磁盘会快速释放