如果表被删除,则永远不会在磁盘上删除SSTable

时间:2016-12-26 13:33:48

标签: cassandra tombstone

如果删除表,则永远不会在磁盘上删除SSTable。

我有一张桌子,其墓碑数是> 100000,因为我的读取查询丢失了Tombstones。然后我删除了表,但这并没有删除SSTable文件。我重新创建了表,然后运行了我的选择查询,我再次看到了墓碑错误。我不明白为什么旧的墓碑错误再次出现? 此外,什么时候SSTable在磁盘上被删除?

3 个答案:

答案 0 :(得分:2)

截断表不会删除磁盘上的SSTable。您需要运行nodetool cleanup

Tombstones将通过压缩消失,但只有gc_grace_seconds过去一次。默认值为10天。为什么这么久?它被设计为比一周长一点,在丢弃删除之前提供足够的时间在集群上运行修复。这最大化了节点间一致性的机会。

答案 1 :(得分:0)

截断操作比删除操作更安全并重新创建。 Truncate可能会抛出超时异常,再次执行它直到它完全完成。

答案 2 :(得分:0)

为了从磁盘中删除表,您需要确保当前没有硬链接指向它们。默认情况下,DROP命令将创建CF的快照。您需要在YAML文件中将false属性设置为auto_snapshot

# Whether or not a snapshot is taken of the data before keyspace truncation
# or dropping of column families. The STRONGLY advised default of true 
# should be used to provide data safety. If you set this flag to false, you will
# lose data on truncation or drop.
auto_snapshot: false

如果您想要安全方面的错误(以及重新创建密钥空间的一般过程),您可以选择:

  • DROP TABLE IF EXISTS mytable
  • CREATE TABLE mytable(....)
  • TRUNCATE mytable

到目前为止,我从未遇到任何问题。