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>

使用"truncate"命令后,"select count(*)"返回的数字变化很快,稳定在34。为了确保当时没有其他程序插入记录,我运行了一个CQL语句,显示所有记录都是在7月22日或23日创建的,也就是4 - 5天前。

我尝试了几次"truncate"命令,结果都是一样的。

这发生在2个环境中。第一个环境是在我的笔记本电脑上,我使用本地主机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.

谁能帮我弄清楚发生了什么事?

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

显然,这不是一个众所周知的(出版良好的)错误,因为当我在2014年Cassandra峰会上向他们重现它时,许多DataStax专家也不知道它。他们也很困惑,直到CQL架构师拜访并说他在最近的版本中修复了一个神秘的错误。他让我升级到2.0.10,问题就解决了。

在2.0.10中"truncate"之后没有更多的残留记录。

Truncate不会截断提示,所以等待传递的提示仍然会被传递。这可能会导致您的问题,特别是如果您快速插入许多行,可能会导致一些丢失的突变。然而,提示通常是在几分钟内传递的,而不是几天,所以如果提示导致了你的问题,那么一定是其他地方出了问题。您可以看到提示何时从日志中传递。

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

在截断之前必须确保所有节点都已启动。

如果您正在使用Astyanax

/* keyspace变量为keyspace Type */keyspace.truncateColumnFamily(ColumnFamilyName);

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

最新更新