美文网首页
大表数据安全删除

大表数据安全删除

作者: little多米 | 来源:发表于2021-04-28 19:37 被阅读0次

    背景
    有张记录表包含三千多万条历史记录,其中有一半以上数据为0,为0数据在业务上没有意义,其它表关联此表进行统计查询较多,为提高查询效率,故删除此部分无效数据。

    方案
    因为要删除一千五百多万条数据,直接通过条件进行删除耗时较长,且易导致锁表。因此,需要更精细一点的删除。

    步骤
    1、筛选记录
    首先,根据删除条件筛选需要删除的记录的id
    筛选语句:
    select id from tablexxx where virtual_flow = 0 and virtual_voice = 0 and flow_date < '2021-04-28 00:00:00'
    将筛选出的记录id全部写入文件deleteids

    mysql -D kyhl -e "$上面筛选语句" > deleteids
    

    检查一下看有多少条记录

    wc -l deleteids
    
    image.png

    3、生成sql脚本
    写脚本generateSql.sh,根据每个小文件生成删除语句,就是拼接为删除的sql,格式为delete from table where id in (id列表)

    如下

    sed "s/^/'&/g" $1 | sed "s/$/&',/g" | sed '1,1s/^/delete from tbl_card_day_flow where id in (&/g' | sed '$s/,/)/g'
    

    每行前加'
    sed 's/^/'&/g' delete00
    每行末加',

    sed 's/$/&',/g' delete00

    首行前加delete from tbl_card_day_flow where iccid_mark in (
    sed '1,1s/^/delete from tbl_card_day_flow where iccid_mark in (&/g' delete00
    尾行后替换,为)
    sed '$s/,/)/g' delete00

    4、执行脚本
    写脚本circleDelete.sh,遍历拆分文件目录,执行完一个就删除一个拆分文件

    for file in `ls /root/delete`; do
    #保存临时sql
            sql1=`sh /root/generateSql.sh $file > /root/tem_delete.sql`
    #执行删除
            result=`mysql -D kyhl -e "source /root/tem_delete.sql"`
    #结果保存到文件
            echo $result >> /root/tem_delete_result
    #删除拆分文件
            rm -f "/root/delete/$file"
    #提示
            echo "$file执行成功"
    #休眠1秒再进行下次删除
            sleep 1
    done
    
    #执行
    sh circleDelete.sh
    
    image.png

    踩坑:不应该对每个拆分文件删除第一行,只需要对总文件删除第一行即可。

    相关文章

      网友评论

          本文标题:大表数据安全删除

          本文链接:https://www.haomeiwen.com/subject/cpcbrltx.html