我正在运行Cassandra 3.9
群集,今天我在一些生成的报告中发现了一些NULL值。
我打开了cqlsh,经过一些查询后,我注意到空值出现在整个数据中,显然是随机列。
Replication factor is 3.
我已在群集上启动了nodetool repair
,但尚未完成。
我的问题是:我搜索了这个行为,无法在任何地方找到它。显然,列中NULL值的随机出现不是常见问题。
有谁知道发生了什么事?这种数据损坏似乎非常严重。提前感谢任何想法。
ADDED详细信息:
发生在经常使用toTimestamp(now())
更新但永远不会返回NULL
的列的情况下发生,因此不会涉及到空数据。
发生在仅插入一次且永不更改的不可变列上。 (但桌子上的其他栏目经常更新。)
更新是否会导致删除这样做?对我来说似乎有点严肃,醒来时会发现一堆NULL
值。
我还特别知道一些丢失的数据,我已经确定的三个条目用于丢失的重要条目。这些还没有被删除 - 一个特定的表上没有删除,到处都是NULL。
我是唯一的管理员,没有人在一夜之间运行任何nodetool
命令,100%肯定。
更新
nodetool repair
现在已经运行了6个多小时,它完全恢复了一个varchar
列“项目描述”中的数据。
这是一个Cassandra问题,不,根本没有删除。就像我说的那些永不返回null的函数在它们中都是null(toTimestamp(now())
)。
更新2
所以nodetool repair
一夜之间完成,但NULLs
仍在那里。{/ p>
所以我逐个节点地停止并重新启动它们,而NULLs
已经消失,没有数据丢失。
如果你问我,这是一个大联盟的错误。我现在没有足够的资源去追求它,但是如果有人在这里面对这个简单的“修复”:
nodetool repair -dcpar
以修复数据中心内的所有节点。答案 0 :(得分:3)
几个月前我遇到过类似的问题。在下面的博客中解释得相当不错。 (这不是我写的)。
在这种情况下,空值实际上是由更新引起的。
答案 1 :(得分:0)
您不会删除数据,也不会使用TTL。可能看起来没有其他方法可以创建NULL值,但是还有一个更棘手的方法:绑定失败,即显式绑定到NULL。这可能看起来很奇怪,但它发生了......
自
...空值出现在整个数据中......
我希望在发布任何更新之前快速捕获这一点,从而在值上启用一些调试或断言代码。
答案 2 :(得分:0)
检查更新查询是否仅更新必要的列,或者通过包含表中所有列的列表的Java bean来检查更新查询。这将解释其他列的NULL更新,这些列不希望更新。