Cassandra“截断”不清空表

Posted

技术标签:

【中文标题】Cassandra“截断”不清空表【英文标题】:Cassandra "truncate" does not empty tables 【发布时间】:2014-09-20 00:46:05 【问题描述】:

我最近遇到了这个问题。当我将表(称为事件和索引)填充到超过 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 个环境中。第一个环境是在我的笔记本电脑上,我使用 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。

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

【问题讨论】:

【参考方案1】:

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

显然,这不是一个众所周知的(广为人知的)错误,因为当我在 2014 年 Cassandra 峰会上将它复制给他们时,许多 DataStax 专家也不知道它。他们也很困惑,直到 CQL 架构师过来并说他在最近的版本中修复了一个神秘的错误。他让我升级到2.0.10,问题就消失了。 2.0.10“截断”后没有更多的挥之不去的记录了。

【讨论】:

它在 3.11.1 中对我来说不是固定的。我不得不关闭集群并在截断后重新启动以摆脱在截断后不断重新出现的幻像行。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

如果您使用的是 Astyanax

/* 键空间变量是键空间类型 */ keyspace.truncateColumnFamily(ColumnFamilyName);

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

【讨论】:

所有 3 个节点肯定都已启动,因为 1)我使用“nodetool status”检查了多次,2)需要 LOCAL_QUORUM 的后续程序已成功运行。新记录只是添加到表中,在那些不能被截断的记录之上。顺便说一句,我正在为我的程序使用 Java Driver 2。

以上是关于Cassandra“截断”不清空表的主要内容,如果未能解决你的问题,请参考以下文章

Navicat:截断表或者清空表后行数不为0

Navicat:截断表或者清空表后行数不为0

hibernate使用truncate清空表 截断表

数据库怎么清空一个表中所有数据

SQL。。。快速清空表的问题。。高手》》

要清空一个表数据