卡桑德拉"截断"不会空表

时间:2014-07-28 18:30:48

标签: cassandra truncate

我最近遇到过这个问题。当我将我的表(称为事件和索引)填充到超过100万,并试图截断它们以进行新测试时,截断后表格不为空。 CQL显示类似

的内容
cqlsh> select count(*) from event limit 100000000;

 count
---------
 2033492


cqlsh> truncate event;
cqlsh> select count(*) from event limit 100000000;

 count
-------
    25

(1 rows)

cqlsh> select count(*) from event limit 100000000;

 count
-------
    27

(1 rows)

cqlsh> select count(*) from event limit 100000000;

 count
-------
    34

(1 rows)

cqlsh> select event_id, dateOf(time_token), unixTimestampOf(time_token), writetime(time_token) from event limit 100000000;

 event_id                             | dateOf(time_token)       | unixTimestampOf(time_token) | writetime(time_token)
--------------------------------------+--------------------------+-----------------------------+-----------------------
 567c4f2b-c86a-4663-a8ec-50f70d183b62 | 2014-07-22 22:29:04-0400 |               1406082544416 |      1406082544416000
 20a2f9e7-cdcb-4c2d-93e7-a646d0910e6b | 2014-07-22 15:12:29-0400 |               1406056349772 |      1406056349774000
 ... ...
 0d983cec-4ba5-4df8-ada8-eb347add57bf | 2014-07-22 22:20:53-0400 |               1406082053926 |      1406082053930000

(34 rows)

cqlsh>

"截断"命令,"选择计数(*)"返回的数字快速变化,并稳定在34。为了确保当时没有其他程序插入记录,我运行了一个CQL语句,显示所有记录都是在7月22日或23日创建的,这是4 - 5天前。

我试过"截断"命令多次,结果是一样的。

这发生在2个环境中。第一个环境在我的笔记本电脑上,我使用localhost IP(127.0.0.2,127.0.0.3和127.0.0.4)创建了3个Cassandra实例集群,而第二个环境是3个节点的Cassandra集群,每个节点都在一个单独的Linux CentOS上6.5机器。我正在使用Cassandra 2.0.6。

有人可以帮我弄清楚发生了什么事吗?提前谢谢。

3 个答案:

答案 0 :(得分:4)

这是Cassandra 2.0.6中的一个错误,至少修复了2.0.10。

显然,它并不是一个众所周知的(发布良好的)错误,因为许多DataStax专家在2014年Cassandra峰会上将它转载给他们时都不知道。他们也很困惑,直到CQL架构师掉线并且说他在最近的发布中修复了一个神秘的bug。他让我升级到2.0.10,问题就消失了。在2.0.10中“截断”后没有更多的延迟记录。

答案 1 :(得分:1)

截断不会截断提示,因此等待交付的提示仍将被提供。这可能会导致您的问题,特别是如果您快速插入大量行可能导致一些丢失的突变。但是,提示通常在几分钟内递送,而不是几天,因此如果提示导致您的问题,则必然会出现其他错误。您可以查看日志中何时提供提示。

删除所有数据最安全的方法是删除表并以不同的名称(或在不同的密钥空间中)重新创建。

答案 2 :(得分:0)

在截断所有节点都已启动之前,您必须确保一件事。

如果您使用的是Astyanax

/ * keypace变量是Keyspace Type * / keyspace.truncateColumnFamily(ColumnFamilyName);

注意:即使在截断后,您也必须手动删除所有表元数据