【问题标题】:How to force delete tombstone created with USING TIMESTAMP in delete CQL statement?如何在删除 CQL 语句中强制删除使用 USING TIMESTAMP 创建的墓碑?
【发布时间】:2023-03-15 05:49:01
【问题描述】:

我们有一个表,我们使用 java max long (9223372036854775807) 作为时间戳删除了一堆行。例如,

使用时间戳 9223372036854775807 从订单簿中删除 r_id,其中 o_id='' AND p_id='' AND e_id='' AND a_id='a1' AND ord_id = 645e7d3c-aef7-4e3c-b834-24b792cf2e55;

这些墓碑是在 sstable 中创建的,markedForDeleteAt = 9223372036854775807。

来自 sstable2json 的示例输出

[ {"key": ":::a1", "细胞": [["645e7d3c-aef7-4e3c-b834-24b792cf2e51:_","645e7d3c-aef7-4e3c-b834-24b792cf2e51:!",9223372036854775807,"t",1476520163], ["645e7d3c-aef7-4e3c-b834-24b792cf2e52:","",1], ["645e7d3c-aef7-4e3c-b834-24b792cf2e55:","",1], ["645e7d3c-aef7-4e3c-b834-24b792cf2e55:r_id",1476520867,9223372036854775807,"d"]]} ]

用如此长的时间创建的墓碑(范围(“t”)或其他(“d”))不会通过次要或主要压缩来收集。我们甚至尝试将 gc_grace_seconds 设置为 0 并运行主要压缩,但没有成功。我认为“markedForDeleteAt + gc_grace_seconds > 压缩时间”等式正在发挥作用,这就是不收集墓碑的原因。但后来我阅读了 cassandra 代码,似乎 localDeletionTime 被考虑在方程式中,而不是标记为 ForDeleteAt。

 * The local server timestamp, in seconds since the unix epoch, at which this tombstone was created. This is
 * only used for purposes of purging the tombstone after gc_grace_seconds have elapsed.
 */
public final int localDeletionTime;

既然如此,我怎样才能从 sstable 中强制删除所有墓碑?

【问题讨论】:

    标签: cassandra cassandra-2.1


    【解决方案1】:

    CASSANDRA-12792 - 由于昨天填充了 Cassandra 错误,无法通过压缩删除使用 Long.MAX_VALUE 编写的墓碑。我不得不做 ETL 和表截断来摆脱墓碑。

    在 db/compaction/LazilyCompactedRow.java 我们只检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-03
      • 2021-04-22
      • 2019-02-16
      • 2017-04-09
      • 2015-06-04
      • 2014-10-16
      • 1970-01-01
      • 2020-05-02
      相关资源
      最近更新 更多