tidb把历史表的一些历史记录删了物理空间会节省吗

大哥大姐,问个问题,我有几个表非常大,都是1T以上的,索引也大。现在想清理空间,我吧这几个表的历史数据删掉保留一部分,比如1000G数据。我删除了600G的数据,这个删除之后空间会释放到系统吗?

删除数据会释放空间的

不是truncate删除。是delete慢慢删。这样也会释放吗?和mysql不一样吗mysql删了之后貌似空间不释放的。物理空间占用比较大

需要等gc慢慢推进,推进之后再等集群compact,如果后面一部感觉比较慢的话,可以等gc完成之后,手动compact,
https://docs.pingcap.com/zh/tidb/v5.4/tikv-control#手动-compact-单个-tikv-的数据

哦好的谢谢。这个compact他是什么时候开始执行。一两天还是到某个阀值。

对于 DELETE 操作,TiDB 的 GC 机制会删除数据,但不会立即释放空间,而是等到后续进行 compaction 时释放空间。

1 个赞

要手动执行compact才能有空间释放吧?

什么时候触发compaction ?

RocksDB的 compaction 由后台线程 BGWorkCompaction 进行调度。该线程的触发一般有手动触发和自动触发两种情况:

  • 手动触发

RocksDB 提供CompactRange、CompactFiles等接口允许用户手动compaction,从而使用户能根据自己的场景触发compaction。

  • 自动触发

当WAL切换或memtable被写满后会调用检查是否需要进行compaction,具体如下:

1、 Memtable达到write-buffer-size(TiKV内默认128M)参数大小时会转换为immtuable memtable 等待flush到磁盘,并开启一个新的memtable用于写入。

2、 Memtable flush 时会导致WAL 切换,同时当 WAL 大小达到max-total-wal-size(TiKV默认4G) 时也会进行切换。

3、 当达到如下条件时则调度compaction线程执行compact操作。

(1) sst文件设置以下标记时:达到ttl时间、达到定期compaction时间、已被标记为compaction等。

(2) 遍历所有level,计算每层的score,如果score>1,则需要compaction,当有多个level都达到触发条件时,会选择score最大的level先进行compact。score计算方法如下:

L0层:当前L0 sst文件数和level0-file-num-compaction-trigger参数比例。

L1层:Ln层总大小(不包含正在compact的文件)和max-bytes-for-level-base*max-bytes-for-level-multiplier^(N-1)的比例。

除了上面的条件触发方式外,RocksDB使用BottomMost Recompaction对最底层的delete记录进行再次检查和清理:当某个操作执行时其快照引用的文件位于最底层时,如果包含很多delete则这些delete的数据不能通过正常的compact方式清理掉,因此在操作执行完后release snapshot时重新检查bottommost level ,确定哪些文件可以被compact,comapct后生成的文件仍位于最底层。

自动compaction可通过disable-auto-compactions 参数关闭,从而可以让用户只使用自定义的compaction 策略,TiKV内同样支持该参数设置。Compaction 的触发原因可通过监控TiKV Detail –> RocksDB KV/ RocksDB raft → Compaction reason查看。
带你全面了解compaction 的13个问题 - 知乎?

1 个赞

gc会清理的

delete删除不会释放的,说释放的自己测试测试。gc和 compaction都不会释放空间。

mysql的delete是不会删除 需要optimize

但是mysql分析表会锁表,这又是一个矛盾点。影响生产业务

gc和 compaction

实际上,TiDB 中的数据存储是基于 Raft 协议的副本复制,当数据被删除时,TiDB 将在 Raft 日志中记录删除操作。这些删除操作会在后续的 Raft 快照和 Compaction 中进行清理,才会真正地释放物理空间。因此,在删除数据时,需要等待一定时间才能真正地释放物理空间。

删除时看到的应该是先增加空间后减少的过程(因为tidb)的机制是任何dml操作都是对数据的插入

当需要删除一个表的所有数据时,推荐使用 TRUNCATE 语句替代delete, 不推荐使用 DELETE 全表数据。

在 TiDB 中使用 DELETETRUNCATEDROP 语句删除数据都不会立即释放空间。对于 TRUNCATEDROP 操作,在达到 TiDB 的 GC (garbage collection) 时间后(默认 10 分钟),TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作,TiDB 的 GC 机制会删除数据,但不会立即释放空间,而是等到后续进行 compaction 时释放空间。

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