你可以从influxdb中删除数据吗?

67

如何从influxdb中删除数据?

文档显示这应该很简单:

delete from foo where time < now() -1h

由于某种原因,influxdb拒绝我的删除语句,并显示“删除查询不能有不引用时间的where子句”。
select * from bootstrap where duration > 1000 and time > 14041409940s and time < now()

我想删除那些持续时间大于1000秒的5个条目enter image description here

这应该是一个有效的SQL语句,但它失败了。

enter image description here

这些删除语句都不起作用

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;

可能这是一个 bug?

https://github.com/influxdb/influxdb/issues/975
https://github.com/influxdb/influxdb/issues/84


你的查询存在两个问题。首先,你不能从除时间以外的任何地方删除,因此这个查询:<p> delete from bootstrap where duration > 3000000 <p> 是无效的。其次,对于这个查询:<p> delete from bootstrap where time > 1404141416824s <p> 你说它是以秒为单位,但实际上这个时间是以毫秒为单位的,所以你需要将其更改为毫秒 :) - Ricardo Origin
嘿@spuder,被接受的答案是错误的。你有没有可能选择John Clements的答案作为正确答案? - Dan Dascalescu
11个回答

57

看起来在influxdb 0.9中可以做到这一点。例如,这是一个刚刚为我成功的查询:

DROP SERIES FROM temperature WHERE machine='zagbar'

(根据@MuratCorlu慷慨的评论,我将我的早期评论重新发布为答案...)


奇怪的是,现在对我来说这个(稍微不同的查询)不起作用,显示错误“ERR:数据库未打开”。 - John Clements
看起来与 https://github.com/influxdb/influxdb/issues/3087 相关(相同?),并且以类似的方式,我发现虽然我确实遇到了错误,但删除实际上确实成功了。 - John Clements
8
不理解为什么在问题中包含时间跨度的情况下,取消一个系列是一个解决方案。 - Ryan Leach
你觉得可以使用一对WHERE子句来指定时间段吗?(注:我没有尝试过,目前没有安装influxDB)。 - John Clements
我已经不在与这个问题相关的公司工作了,所以无法进行测试。 - Ryan Leach

30

使用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上不起作用。


3
我惊讶地发现,目前Influxdb仅支持基于时间的查询。 - dminer
对我来说不合理的是,这个查询语句是:DELETE from foo where time = '2014-06-30 12:18:00',但它并没有起作用。我尝试了time > time <,虽然没有关于时间的投诉,但删除了所有大于time >的数据。 - VMcPherron
2
是的,我发现Influx在处理时间方面存在一些错误。您不能指定一个具体的时间,而需要给出一个包围您想要的日期的时间范围。 - spuder
2
@ spuder,我认为你可以添加一个链接到官方文档。我想这可能对正在寻找答案的某些人很有用。 - Jimilian
3
似乎您可以在influxdb 0.9中这样做。例如,以下查询刚刚为我成功:"DROP SERIES FROM temperature WHERE machine='zagbar';"(对于分号我很抱歉,这是一种习惯性的写法...) - John Clements
显示剩余4条评论

17

我惊讶地发现没有人提到InfluxDB保留策略可以自动删除数据。您可以设置默认的保留策略,并在每个数据库级别上设置它们。

根据文档:

CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [DEFAULT]

2
为避免任何潜在的混淆,这些保留策略链接是针对InfluxDB 0.9的,原帖作者正在使用InfluxDB 0.8。话虽如此,在InfluxDB 0.9中,保留策略绝对是删除数据的首选和最佳方式,但当然它们必须预先配置。 - beckettsean
2
此外,保留策略只有在设置后才会删除数据,它们不会删除先前的数据 - 但是,该数据受到不同的保留策略控制,因此可以单独删除,因为旧的和新的保留策略的数据不重叠(除非您故意手动从一个复制到另一个)。 - Julian Knight

10
因为 InfluxDB 对删除操作比较敏感,所以我们使用了一个称为“ForUse”的布尔字段的模式。在通过行协议 (v0.9) 发布时,它看起来像这样:
your_measurement,your_tag=foo ForUse=TRUE,value=123.5 1262304000000000000

您可以使用发送的任何字段键覆盖相同的测量、标签键和时间,因此我们通过将"ForUse"设置为false来进行"删除",并让保留策略控制数据库大小。

由于覆盖是无缝的,因此您也可以追溯地添加模式。很不错。


有志者事竟成。 - user7817808
4
字段没有被索引,因此每次查询都会有一个删除条目的成本,这可能会成为问题。 - Tommy
太好了。我从未想过可以通过插入一个不同的布尔值"new"点来实现"删除"!真是太棒了! - sivabudh
这是个好主意,但你为什么要用字段而不是标签呢? - max pleaner
2
@maxpleaner - 我使用了字段而不是标签,因为如果我使用标签,它会出现为一个新条目。例如 site=north,cabinet=3,server=2,foruse=Truesite=north,cabinet=3,server=2,foruse=False 将成为两个完全不同的记录。 - Jason

5
在InfluxDB 2中,像 DROP 这样的InfluxQL命令不存在(仅支持InfluxQL只读查询)。相反,您需要使用CLIREST 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'

1
我必须添加令牌字段才能使其正常工作。 - louis xie

4

运行influxdb并选择数据库:

influx -database '<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'

如果你想知道为什么无法运行它,那里有一个错别字 ;) - minhng99
@minhng99 我发现了拼写错误并已经修复了 ;) - Benyamin Jafari

3

这是针对InfluxDB shell版本1.8.2的。

删除也可以不用时间字段。正如您从一系列截图中看到的:

  1. 我创建了一个数据库并开始使用它。

InfluxDB create DB and use it

  1. 在其中添加一些行。验证它们是否已添加。

Add rows in influxdb and print

  1. 删除所有带有标记“Dev1”的数据,并验证相同。

Delete all rows for tag from influxdb

注意:标记名称必须只用单引号,不能用双引号。


2

被接受的回答(DROP SERIES)适用于许多情况,但如果您需要删除的记录分布在许多时间范围和标签集之间,则无法使用此方法。

一种更通用的方法(虽然较慢)是逐个发出删除查询,并使用另一种编程语言。

最初的回答(Original Answer)

  1. Query for all the records you need to delete (or use some filtering logic in your script)
  2. For each of the records you want to delete:

    1. Extract the time and the tag set (ignore the fields)
    2. Format this into a query, e.g.

      DELETE FROM "things" WHERE time=123123123 AND tag1='val' AND tag2='val'
      

      Send each of the queries one at a time


1
你只能使用时间字段来删除,该字段是一个数字。
Delete from <measurement> where time=123456

会起作用。记得不要使用单引号或双引号。这是一个数字。


这不是真的,你也可以在删除查询中指定标签。 - max pleaner

1
除了之前提供的好答案之外,如果您正在使用版本>2.*并且可以使用其UI(通常在端口8086上):
  • 进入“数据”
  • 选择“存储桶”
  • 还要选择您想管理的存储桶
  • 并按照下面的描述设置保留时间;

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接