TIDB5.1 进行循环删除2亿的数据但是磁盘空间一周时间了并没有下降很多。

TIDB5.1 进行循环删除2亿的数据但是磁盘空间一周时间了并没有下降很多。是什么原因呢?怎么解决呢?

delete不会释放磁盘空间,需要手动compact才会释放。

手动compact 命令是什么啊?会影响生产环境的稳定性吗?

手动 compact会消耗kv磁盘资源,建议在业务低谷期做,一个kv一个kv做
https://docs.pingcap.com/zh/tidb/stable/tikv-control#手动-compact-单个-tikv-的数据

1 个赞


https://docs.pingcap.com/zh/tidb/stable/migration-tidb-faq#tidb-中删除数据后会立即释放空间吗

1 个赞

删除完2亿还剩下多少数据?

1 个赞

你预计释放多少空间呢

delete会产生很多的日志吧

这delete不释放啊 ,建个新表换名字也行

用shell只对oltp.sbtest8这个表(对应换成你的表名)做compact ,加-c write -d kv

mysql -uroot -pXXX -hxxx -PXXX information_schema -e “select region_id from tikv_region_status where db_name=‘oltp’ and table_name=‘sbtest8’”>region_list
cat region_list|while read line
do
tiup ctl:v5.1.0 tikv --host xxxx:20160 compact -r $line -d kv -c write --threads 1 --bottommost force
tiup ctl:v5.1.0 tikv --host xxx:20160 compact -r $line -d kv -c default --threads 1 --bottommost force
done

1 个赞

手动compact也不好用,巨慢又会占用大量磁盘空间,最后效果也不明显

仅仅删除数据不会降低物理磁盘空间。

数据文件删除才会降低,另外还要注意,删除操作的日志不用保留

看来delete的机制还要改进

看一眼gc时间,pd的监控是不是有新数据写入

业务上没有办法使用drop和trucate的,只能用delete的,这种就不要关注空间是否释放,只需要关心表的空间是否还在增长

TiDB 采用了多版本并发控制 MVCC,为了使并发事务能查看到早期版本的数据,删除数据不会立即回收空间,而是推迟一段时间后再进行垃圾回收 (GC)。
可以通过修改系统变量 tidb_gc_life_time的值(默认值为 10m0s)配置历史数据的保留时限。
可以设置并行 GC,加快对空间的回收速度。默认并发为 1,最大可调整为 tikv 实例数量的 50%。可使用 update mysql.tidb set VARIABLE_VALUE=“3” where VARIABLE_NAME=“tikv_gc_concurrency”; 命令来调整。
DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DROP 操作,在达到 TiDB 的 GC (garbage collection) 时间后(默认 10 分钟),TiDB 的 GC 机制会删除数据并释放空间。

对于 DELETE 操作 TiDB 的 GC 机制会删除数据,但不会释放空间,而是当后续数据写入 RocksDB 且进行 compact 时对空间重新利用。

1 个赞

手工compact我昨天测了下,跑一次未必性,可能还得反复跑才有效果

你用过mysql就知道了,都是这个机制

mysql可以 alter table A engine=innodb来重建表,高版本支持online ddl,解决这个问题不要太简单


这个怎么解决