2016-12-26 146 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