我最近遇到了这个问题。当我将表(称为事件和索引)填充到超过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,问题就解决了。
Truncate不会截断提示,所以等待传递的提示仍然会被传递。这可能会导致您的问题,特别是如果您快速插入许多行,可能会导致一些丢失的突变。然而,提示通常是在几分钟内传递的,而不是几天,所以如果提示导致了你的问题,那么一定是其他地方出了问题。您可以看到提示何时从日志中传递。
在截断之前必须确保所有节点都已启动。
如果您正在使用Astyanax
/* keyspace变量为keyspace Type */keyspace.truncateColumnFamily(ColumnFamilyName);
注意:即使在截断后,您也必须手动删除所有表元数据