2016-12-26 154 views
1

如果表被删除,SSTables永远不会被删除。如果表被删除,SSTables永远不会在磁盘上被删除

我有一个表的墓碑数超过100000,因为我的阅读查询抛出了墓碑错误。然后我删除了表,但是这并没有删除SSTable文件。我重新创建了表格,然后运行了我的选择查询,我又看到了墓碑错误。我不明白为什么旧的墓碑错误再次出现? 此外,SSTable何时会在磁盘上被删除?

回答

0

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

1

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

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

+0

我做了“drop table xyz”,并且相应的sstables没有从磁盘中删除。我也运行nodetool清理,但没有帮助。 – Hemalatha

+0

xmas79是正确的Cassandra将快照数据,从而创建硬链接。使用'nodetool clearsnapshot'删除所有快照或删除特定表的快照。在Linux中,'ls -l'会告诉你存在多少个到文件的硬链接。 – Bradski

+0

我发现sstables文件夹永远不会被删除,即使它里面的所有文件(db,index等)都被删除了。并且没有快照存在。任何想法为什么发生这种情况 – Hemalatha

0

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

# 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

迄今为止,我从未遇到过这个问题。

+0

我做了auto_snapshot:false并重新启动了Cassandra。另外,按照你所说的去掉并重新创建一个表格。在删除或截断表时,如果转到Cassandra的数据目录并验证,SStable文件仍然存在于磁盘上。我想知道,为什么表的SStable文件仍然保留在磁盘上,并且没有被删除? – Hemalatha