【InfluxDB】【批量删除数据】【shell脚本】

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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WaiSaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值