influxdb 1.x 支持 sql 风格 delete 语句(如 delete from "cpu" where time
用
DELETE语句删数据,但得先确认 InfluxDB 版本InfluxDB 1.x 和 2.x 的删除方式完全不同,不看版本直接写
DELETE很可能报错或没效果。1.x 支持 SQL 风格的DELETE,而 2.x(含 Cloud)默认禁用该操作,必须通过 API 或influx delete命令执行。Go 程序里调用时,本质是发 HTTP 请求——所以关键不是“Go 怎么写”,而是“该往哪个 endpoint 发什么 payload”。
- 查版本:请求
http://localhost:8086/ping,看响应头X-Influxdb-Version- InfluxDB 1.x:走
/query接口,q=DELETE FROM "measurement" WHERE time- InfluxDB 2.x:走
/api/v2/delete,需提供org、bucket、start/stop时间范围,且必须带有效 tokenInfluxDB 1.x:Go 中用
http.PostForm发DELETE1.x 的
DELETE是同步阻塞操作,会锁住 shard 一段时间,大范围删除容易超时或夯住写入。示例代码片段(注意 URL 编码和错误检查):
resp, err := http.PostForm("http://localhost:8086/query", url.Values{ "q": {"DELETE FROM \"cpu\" WHERE time
- 时间条件必须用 RFC3339 格式(如
'2024-01-01T00:00:00Z'),不能用 Unix 时间戳或本地时间字符串- 不支持
DELETE带GROUP BY或聚合函数,只能按时间+tag 过滤- 若 measurement 名含空格或特殊字符,要用双引号包裹,如
"my cpu"InfluxDB 2.x:必须用
influx deleteAPI,Go 要构造 JSON body2.x 的
DELETE不是 SQL,而是按时间窗口批量标记删除,底层靠 TSM 文件重写实现,实际清理有延迟(通常几分钟到几小时)。Go 中需手动构建 POST 请求体,例如删掉某 bucket 中 24 小时前的数据:
body := map[string]string{ "start": "1970-01-01T00:00:00Z", // 注意:2.x 要求 start 必须是 Unix epoch 或更早 "stop": "2024-01-01T00:00:00Z", "predicate": "_measurement==\"cpu\"", } jsonBody, _ := json.Marshal(body) req, _ := http.NewRequest("POST", "http://localhost:8086/api/v2/delete?org=my-org&bucket=my-bucket", bytes.NewBuffer(jsonBody)) req.Header.Set("Authorization", "Token my-super-secret-token") req.Header.Set("Content-Type", "application/json")
start不能大于stop,且start若设为未来时间,请求会静默失败(返回 204 但无效果)predicate是 Flux 表达式语法,只支持_measurement、_field、tag 键,不支持正则或函数- 没有权限时返回 401;bucket/org 名错返回 404;时间格式错返回 400 并带具体错误字段名
删完看不到数据?别急着重试,先查
_field_keys和SHOW RETENTION POLICIES删除操作成功不代表立刻查不到——1.x 中 shard compact 未完成时,旧点仍可能被读出;2.x 中 delete marker 生效前,query 仍可返回已标记删除的数据(除非加
ignoreDeletes:true参数)。
- 验证是否真删了:用
SELECT count(*) FROM "cpu"看行数变化,比SELECT *更可靠- 删了数据但磁盘没释放?1.x 需手动运行
influxd-ctl compact-shard <shard-id></shard-id>;2.x 依赖后台 compaction,无法手动触发- 误删怎么办?1.x 只能从备份恢复;2.x 无回收站,
influx delete是不可逆的最常被忽略的一点:InfluxDB 的「删除」本质是打标记或删文件,不是逐条擦除。如果你在压测后删数据却还看到 high cardinality 报警,大概率是 tag value 没清干净——那部分元数据不会随
DELETE消失,得靠DROP SERIES(1.x)或重建 bucket(2.x)来彻底清理。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!












