Background
influxdb设计原则就是为了提供高性能的查询和写入,所以对删除操作进行了严格的限制,可以根据time和tag进行批量删除,不支持基于field进行批量删除,只能一条一条删除,这里写了个shell脚本,该脚本需要两个参数,第一个参数是所操作的数据库,第二个参数是要删除的范围的sql语句。同时,删除前会打印要删除的记录总数和确认信息。
已迭代出新版,功能更强大更完善,请参考另一篇博客Influxdb数据删除脚本【支持field条件】【自动备份】【支持数据恢复】
直接上脚本 influxdb-batch-delete-with-field-condition.sh
#!/bin/bash
:<<!
【脚本说明】
1、此脚本适用根据field条件批量删除数据,有两个必传参数;
2、参数一:操作的数据库;
3、参数二:条件sql;
4、注意:
1)第二个参数sql请用双引号;
2)sql中不能用*号;
3)第二个参数中若有时间格式请用标准格式(yyyy-MM-dd HH:mm:ss.SSS)
4)官方支持根据时间或tag进行批量删除,不支持field条件批量删除。
!
# 第一个参数:数据库
db=$1
# 第二个参数:满足条件的查询语句
typeset -l sql
sql=$2
# 定制化shell输出
function custom_print(){
echo -e "\033[5;34m ***** \033[0m"
echo -e "\033[32m $@ ! \033[0m"
echo -e "\033[5;34m ***** \033[0m"
}
# 判断输入参数
if [[ -z $db || -z $sql || $db = "help" ]]; then
# 该脚本名
script_name=$0
# 请输入操作参数
s1="\n eg.【sh $script_name db_gkc_mix \"select time,v1 from raw_yb where pid = '49' and abs(v1) < 16\"】"
s2="\n notice.【sql without *】"
msg="Please input param 【database \"select_sql\"】$s1$s2"
custom_print $msg
exit 1
fi
# 获取表名
function get_tbl(){
t1=${sql##*from}
t2=${t1%%where*}
echo $t2
}
# 从输入的sql语句中获取表名
tbl=$(get_tbl)
# 先查出来符合条件的数据
influx -username admin -password 'cloudansys[admin]' -database "$db" -execute "$sql tz('Asia/Shanghai')" > a.txt
# 对查出的结果进行处理,获取要删除的时间集合
awk '/16/ {print $1}' a.txt > aa.txt
# 输出要删除的记录条数
record_size=$(cat aa.txt | wc -l)
echo "查询到符合条件的记录数为:$record_size"
# 一条一条删除
function delete_one_by_one(){
# 删除开始时间
starttime=`date +'%Y-%m-%d %H:%M:%S'`
# 然后遍历时间集合逐条删除
declare -i num=0
declare -i remain_count=0
# 先隐藏光标
echo -e "\033[?25l\c"
for time in $(cat aa.txt)
do
influx -username admin -password 'cloudansys[admin]' -database "$db" -execute "delete from $tbl where time = $time"
num=$((num+1))
remain_count=$((record_size-num))
echo -e "\r\033[32m$remain_count \033[0m\c"
done
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s)
end_seconds=$(date --date="$endtime" +%s)
# 再显示光标
echo -e "\033[?25h"
echo "耗时:"$((end_seconds-start_seconds))" s"
}
# 删除确认(不区分大小写)(输入正常退出,输入错误则需重新输入)
if [[ $record_size -gt 0 ]]; then
while true
do
read -r -p "确认删除这$record_size条记录么? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo -e "deleting\033[5;32m... \033[0m"
delete_one_by_one
# 最后把中间文件删除
rm -rf a.txt aa.txt b.txt bb.txt
echo "Finshed !"
exit 1
;;
[nN][oO]|[nN])
echo "Cancel delete !"
# 最后把中间文件删除
rm -rf a.txt aa.txt b.txt bb.txt
exit 1
;;
*)
echo "Invalid input..."
;;
esac
done
else
rm -rf a.txt aa.txt
fi