TiDB磁盘释放很慢

【 TiDB 使用环境`】生产环境
【 TiDB 版本】v 5.1.0
【遇到的问题】
1、生产环境一张大表有460亿条数据,使用delete删除350亿条记录,然后使用analyze table后,数据占有空间由6.34T降到5.59T,即降了6.34-5.59=0.75T,索引占用空间由3.63-3.2=0.43T,总共降低大约0.75+0.43=1.18T,但是5台TiKV每台只释放大约10G占用,即还有大量空间没有释放。

2、后经查询官方文档,5.1版本存在bug,需要将tikv gc.enable-compaction-filter参数由true调整为false来释放磁盘空间,我们也按要求做了,修改参数后并重启集群,但是释放的空间速度很忙,查询GC worker CPU后发现重启之后gc是在干活儿的,就是清理的比较慢,有没有快速清理方法?
备注:GC worker CPU使用情况

delete方式就会慢,因为要先把delete的数据标记删除,然后GC时rocksdb层在标记一层删除,之后compact时才能释放delete的空间,大数据量删除适合使用truncate,GC时会调用另外的逻辑直接删物理文件

4 Likes

:+1::+1::+1:

关键是此表是业务表,不能直接truncate的,故只能采用delete,但是现在磁盘空间不能释放,而每天新增大约20G数据量,所以很是着急,希望哪位大师能给分析一下,看看可有好的解决方案。

如果这张表的大部分历史数据要删除 且业务会写入新的数据的话 考虑是否可使用rename 的方式呢

试试手工compact,
对这个每个 tikv先后执行
tikv-ctl compact -d kv -c write
tikv-ctl compact -d kv -c default
tikv-ctl compact -d kv -c write --bottommost force
tikv-ctl compact -d kv -c lock --bottommost force

2 Likes

请问一下此操作对生产库影响可大?是否需要停业务操作,对于5节点tikv(每个节点1.5T数据量)执行此操作大约需要多长时间?

https://docs.pingcap.com/zh/tidb/stable/tikv-control
可以先试试不停tikv 时 --host 指定tikv地址方式,compact期间会有大量IO 、计算,肯定会消耗资源的,尤其磁盘性能不佳时

1 Like

:+1::+1::+1::+1::+1:

任何数据库delete450亿都不快。

对了,补充一句,任何数据库delete也不释放空间。

这个了解,正因为不释放空间,才会有以上各种操作。

我是用java跑批删除的,中间设置时间间隔,跑了几周。

一般来说,要这种释放空间的都是建立分区,然后定期截断分区。

1 Like

后期准备改架构,按业务进行分区。

460亿的表 要删除450亿,为啥不导出剩余10亿到新的表,再各自rename,最后truncate呢

不要意思是460亿的表,删除350亿,还剩余110亿数据。

请问这个命令能直接执行吗?还是需要修改?我直接执行报如下错误?能不能补充一下完整命令,谢谢!


我测试环境,版本v5.1.0:
TiDB01/PD01: 192.168.18.203
TiKV01: 192.168.18.239
TiKV01: 192.168.18.240
TiKV01: 192.168.18.241

参考前面发的连接 加上 --host tikv_IP:port

1 Like

你好,根据你的提示及结合help,得出如下命令不知可正确?还有所有tikv执行完后磁盘空间会释放吗?我们生产环境tikv 5个节点,每个节点大约2T数据,不知大概需要执行多长时间?