您可以从 influxdb 中删除数据吗?
Posted
技术标签:
【中文标题】您可以从 influxdb 中删除数据吗?【英文标题】:Can you delete data from influxdb? 【发布时间】:2014-12-03 19:13:02 【问题描述】:如何从 influxdb 中删除数据?
文档显示它应该很简单:
delete from foo where time < now() -1h
出于某种原因,influxdb 拒绝我的删除语句,说“删除查询不能有不引用时间的 where 子句”
select * from bootstrap where duration > 1000 and time > 14041409940s and time < now()
我想删除这 5 个持续时间 > 1000 秒的条目
这应该是一个有效的 sql 语句,但它失败了
这些删除语句都不起作用
delete from bootstrap where duration > 3000000"
delete from bootstrap where duration > 300000"
delete from bootstrap where time = 1404140994043"
delete from bootstrap where duration > 300000 and time > 1404141054508 "
delete from bootstrap where duration > 300000 and time > 1404141054508s "
delete from bootstrap where time > 1404141054508s and duration > 300000 "
delete from bootstrap where duration > 30000 and time > 1s"
文档参考
https://docs.influxdata.com/influxdb/v2.0/query-data/influxql/
更新
其他查询
delete from bootstrap where time > 1404141416824 and duration > 3000;
delete sequence_number from bootstrap where time > 1s and duration > 1000;
也许这是一个错误?
https://github.com/influxdb/influxdb/issues/975https://github.com/influxdb/influxdb/issues/84
【问题讨论】:
您的查询的问题只有 2。首先,除了时间之外,您不能从任何内容中删除:从引导程序中删除,其中持续时间 > 3000000
不起作用,并且使用此查询
从 bootstrap 中删除 time > 1404141416824s
你说的是以秒为单位的,但时间是以毫秒为单位的,所以你必须更改为 ms :)
嘿@spuder,接受的答案是错误的。您有机会选择 John Clements 的答案作为正确答案吗? 【参考方案1】:influx只能按时间删除
例如以下是无效的:
#Wrong
DELETE FROM foo WHERE time < '2014-06-30' and duration > 1000 #Can't delete if where clause has non time entity
这就是我删除数据的方式
DELETE FROM foo WHERE time > '2014-06-30' and time < '2014-06-30 15:16:01'
更新:这适用于 influx 8。据说它不适用于 influx 9
【讨论】:
我也很沮丧地发现 Influxdb 目前只支持基于时间的查询。 对我来说没有意义的是这个查询有时间:DELETE from foo where time = '2014-06-30 12:18:00' 但这不起作用。我确实尝试了时间>时间 是的,我发现influx 在时间上是错误的。你不能指定一个具体的时间,你需要给它一个围绕你想要的日期的范围。 @spuder,我想你可以加个官方链接documentation。我想它可能对正在寻找答案的人有用。 看来你可以在 influxdb 0.9 中做到这一点。例如,这是一个对我来说刚刚成功的查询:“DROP SERIES FROM temperature WHERE machine='zagbar';” (对不起分号,这是一种反射......)【参考方案2】:看来您可以在 influxdb 0.9 中执行此操作。例如,这里有一个对我来说刚刚成功的查询:
DROP SERIES FROM temperature WHERE machine='zagbar'
(根据@MuratCorlu 的慷慨评论,我将重新发布我之前的评论作为答案......)
【讨论】:
奇怪的是,现在这不对我有用(查询略有不同),提示错误“ERR:数据库未打开” 看起来与 github.com/influxdb/influxdb/issues/3087 相关(相同?),并且以类似的方式,我看到虽然我确实收到了错误,但删除确实成功了。 当问题包含时间跨度时,我无法理解如何放弃系列是答案? 在我看来,您可以使用一对 WHERE 子句指定时间跨度,不是吗? (注意:没有尝试过,没有安装 influxDB 的 ATM)。 我不再受雇于与此问题相关的地方,因此无法测试。【参考方案3】:我很惊讶没有人提到 InfluxDB retention policies 自动删除数据。您可以设置默认保留策略,也可以在每个数据库级别进行设置。
来自the docs:
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [DEFAULT]
【讨论】:
为避免任何潜在的混淆,这些保留政策链接适用于 InfluxDB 0.9,原始发布者使用的是 InfluxDB 0.8。也就是说,在 InfluxDB 0.9 中,保留策略绝对是删除数据的第一个也是最好的方法,但它们当然必须预先配置。 此外,保留策略仅在设置后删除数据,它们不会删除以前的数据 - 但是,该数据处于不同的保留策略下,并且可以单独删除,因为新旧 RP 的数据会不重叠(除非您故意手动从一个复制到另一个)【参考方案4】:因为 InfluxDB 对删除有点痛苦,所以我们使用了一个具有名为“ForUse”的布尔字段的架构,当通过线路协议 (v0.9) 发布时看起来像这样:
your_measurement,your_tag=foo ForUse=TRUE,value=123.5 1262304000000000000
您可以使用您发送的任何字段键覆盖相同的测量值、标签键和时间,因此我们通过将“ForUse”设置为 false 并让保留策略控制数据库大小来执行“删除”。
由于无缝覆盖,您也可以追溯添加架构。噪音。
【讨论】:
有志者事竟成。 虽然字段没有被索引,所以这样每个查询都有每个删除条目的成本。这可能有问题,也可能没有问题。 可爱。我从没想过您可以通过使用不同的布尔值插入“新”点来“删除”!太棒了! 这是个好主意,但为什么要使用字段而不是标签呢? @maxpleaner - 我使用字段而不是标签,因为如果我使用标签,它将显示为新条目。例如site=north,cabinet=3,server=2,foruse=True
和 site=north,cabinet=3,server=2,foruse=False
将是两个完全不同的记录。【参考方案5】:
我正在添加此命令作为参考,以更改 kubernetes k8s 中 InfluxDB 容器内的保留。使用 wget 是因为容器没有 curl 和 influx CLI
wget 'localhost:8086/query?pretty=true' --post-data="db=k8s;q=ALTER RETENTION POLICY \"default\" on \"k8s\" duration 5h shard duration 4h default" -O-
验证
wget 'localhost:8086/query?pretty=true' --post-data="db=k8s;q=SHOW RETENTION POLICIES" -O-
【讨论】:
【参考方案6】:你只能用你的时间字段删除,这是一个数字。
Delete from <measurement> where time=123456
会起作用。记住不要给单引号或双引号。它是一个数字。
【讨论】:
这不是真的,你也可以在删除查询中指定标签。【参考方案7】:已接受的答案(DROP SERIES)适用于许多情况,但如果您需要删除的记录分布在多个时间范围和标签集之间,则无法正常工作。
一种更通用的方法(尽管速度较慢)是使用另一种编程语言逐个发出删除查询。
-
查询您需要删除的所有记录(或在脚本中使用一些过滤逻辑)
对于您要删除的每条记录:
-
提取时间和标签集(忽略字段)
将其格式化为查询,例如
DELETE FROM "things" WHERE time=123123123 AND tag1='val' AND tag2='val'
一次发送一个查询
【讨论】:
【参考方案8】:这是 InfluxDB shell 版本:1.8.2
删除也没有时间字段。从一系列屏幕截图中可以看出:
-
我创建了一个数据库并添加开始使用它。
-
在其中添加一些行。验证是否已添加。
-
删除所有带有“Dev1”标签的内容并进行验证。
注意:标签名称只能用单引号括起来。不是双重的。
【讨论】:
【参考方案9】:运行 influxdb 并选择数据库:
influx -databse '<database-name>'
然后运行查询:
DELETE WHERE time < '2021-04-11 7:00:00'
或者如果你想从特定的measurement
删除数据
DELETE FROM <measurement> WHERE time > '2014-06-30' and time < '2021-04-10 15:16:01'
【讨论】:
【参考方案10】:在 InfluxDB 2 中,不存在像 DROP
这样的 InfluxQL 命令(仅支持 InfluxQL 只读查询)。相反,您需要使用CLI 或REST API。
例子:
influx delete --bucket "MY BUCKET" --predicate '_measurement="MY_MEASUREMENT"' -o "MY ORG" --start '1970-01-01T00:00:00Z' --stop '2025-12-31T23:59:00Z'
【讨论】:
我必须添加令牌字段才能使其工作。以上是关于您可以从 influxdb 中删除数据吗?的主要内容,如果未能解决你的问题,请参考以下文章