在InfluxDB(1.5)中,我有一个表,其中字段的类型不一致。表中的大多数行都是Integer,但是有些行已变成字符串。
这怎么可能?我以为,一旦设置了字段的类型(第一次插入时),任何在表中键入错误的输入都会失败。
我现在该怎么办?如果我回去尝试覆盖不一致的行中的数据,则会收到错误消息,指出该字段是字符串。
答案 0 :(得分:1)
经过更多研究,这是我发现的东西:
第1部分的答案
InfluxDB使用他们称为“分片”的系统-虽然我不知道具体细节,但是我知道来自同一度量/表的数据可以存储在多个不同的“分片”中。
根据InfluxDB文档,在同一表的同一字段中,这些分片之间的字段类型可以不同。
第2部分的答案
为了解决此问题,currently-suggested answer将创建一个新表,下载所有数据,然后重新插入,同时确保所插入的数据是正确的类型。
如果您有一个更改了类型并变成字段的标签,则可能很难修复,上面的链接无法解决。要仅对标记或字段进行选择,可以在select语句中使用tag_name::tag
或field_name::field
。
该链接中建议的GROUP BY *
子句是保留标签所必需的,但在使用时似乎会引起问题。
我当前的解决方案是一个使用curl的PHP脚本,下载该点,将它们分块,然后将这些点重新插入到新表中,确保插入的每个点都强制转换为新的统一类型并正确插入
阻止未来出现问题的最好方法就是不要让它们出现。我一直在寻找如何在所有情况下针对特定测量表在所有分片中锁定字段类型的方法。
不幸的是,似乎不可能保证所有当前和将来的分片都具有100%的类型一致性。 InfluxDB的作案手法似乎是“不要犯错,因为真的很难清理”。