Dan*_*scu 14 delete-row influxdb
InfluxDB允许您根据条件删除点WHERE tag='value'
,但不能按字段值删除.
例如,如果您在一系列正浮点数(例如CPU利用率)中意外存储了值为-1的度量值,DELETE FROM metrics WHERE cpu=-1
则会返回此错误:
删除期间WHERE子句中不支持的字段
Har*_*gar 10
昂贵的方法
# Copy all valid data to a temporary measurement
SELECT * INTO metrics_clean FROM metrics WHERE cpu!=-1 GROUP BY *
# Drop existing dirty measurement
DROP measurement metrics
# Copy temporary measurement to existing measurement
SELECT * INTO metrics FROM metrics_clean GROUP BY *
Run Code Online (Sandbox Code Playgroud)
# Copy all valid data to a temporary measurement within timerange
SELECT * INTO metrics_clean FROM metrics WHERE cpu!=-1 and time > '<start_time>' and time '<end_time>' GROUP BY *;
# Delete existing dirty data within timerange
DELETE FROM metrics WHERE time > '<start_time>' and time '<end_time>';
# Copy temporary measurement to existing measurement
SELECT * INTO metrics FROM metrics_clean GROUP BY *
Run Code Online (Sandbox Code Playgroud)
这在InfluxDB中是不可能的 - 参见ticket 3210.
您可以通过在测量中插入具有相同时间戳和标记集的点来覆盖具有其他值的点:
点由测量名称,标记集和时间戳唯一标识.如果您使用相同的度量,标记集和时间戳作为现有点提交新点,则字段集将成为旧字段集和新字段集的并集,其中任何绑定都将转到新字段集.这是预期的行为.
由于您不应该插入空值,因此您可能希望重复前一个点的值.
您可能会考虑插入具有相同时间戳的点,并为其中一个标记设置唯一值,然后针对该标记运行删除:
DELETE FROM measurement WHERE some_existing_tag='deleteme'
Run Code Online (Sandbox Code Playgroud)
但这不起作用.您将得到两个具有相同时间戳的点,其中一个具有该deleteme
标记.
丑陋而缓慢但相当健壮的解决方案:存储时间戳,然后按时间戳删除条目,可选地过滤DELETE
带有附加标签的语句。
注意,这仅在字段具有唯一时间戳时才有效!例如,如果一个时间戳有多个字段,则使用以下命令删除所有这些字段。使用epoch=ns
实际上可以减轻这种情况,除非您每秒有大约十亿个数据点
curl -G 'http://localhost:8086/query?db=DATABASE&epoch=ns' \
--data-urlencode "q=SELECT * FROM metrics WHERE cpu=-1" |\
jq -r "(.results[0].series[0].values[][0])" > delete_timestamps.txt
for i in $(cat delete_timestamps.txt); do
echo $i;
curl -G 'http://localhost:8086/query?db=DATABASE&epoch=ns' \
--data-urlencode "q=DELETE FROM metrics WHERE time=$i AND cpu=-1";
done
Run Code Online (Sandbox Code Playgroud)