大表数据安全删除

背景
有张记录表包含三千多万条历史记录,其中有一半以上数据为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](https://img-blog.csdnimg.cn/img_convert/8c74eda5a184408bd84a50df730ab62a.png#align=left&display=inline&height=35&margin=[object Object]&name=image.png&originHeight=70&originWidth=312&size=4162&status=done&style=none&width=156)
这里要删除第一行的列字段

sed '1,1d' deleteids

2、拆分文件
因为文件太大,先拆分为多个小文件,按500行一个文件进行拆分

split -l 500 -d --verbose deleteids /root/delete/delete

![image.png](https://img-blog.csdnimg.cn/img_convert/ec5a0723dc64959f4e2939353ac2b0da.png#align=left&display=inline&height=203&margin=[object Object]&name=image.png&originHeight=405&originWidth=411&size=31295&status=done&style=none&width=205.5)
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://img-blog.csdnimg.cn/img_convert/5eb91535b1b84c007cef7f133949a834.png#align=left&display=inline&height=177&margin=[object Object]&name=image.png&originHeight=353&originWidth=339&size=18582&status=done&style=none&width=169.5)
踩坑:不应该对每个拆分文件删除第一行,只需要对总文件删除第一行即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值