大量删除数据库记录

#!/bin/bash

FILE=result.sql
BAK="klvchen.goods_detail_img_20210127"        # 备份删除数据的表
PRO="klvchen.goods_detail_img"                 # 需要删除的表

for((i=0;i<=9060;i++))do                       # 循环 9060 次,每次 1000 条数据,删除 9060000 多数据
    mysql -h XXXXXX-uXXXXXX -pXXXXXX -e "select id from ${BAK} limit `expr $i \* 1000`, 1000" > $FILE
    sed -i '1d' $FILE                          # 删除第一行

    sed -i "s#^#\'#g"   $FILE                  # 在每行第一个字符前加 '
    sed -i "s#\$#\',#g" $FILE                  # 在每行最后一个字符前加 ',

    sed -i "1s#^#delete from ${PRO} where id in (\n#"  $FILE   # 在第一行插入数据

    sed -i '$s#,#);#'   $FILE                  # 在最后一行把 , 替换成 ;#  


    mysql -h XXXXXX -uXXXXXX -pXXXXXX < $FILE
    
    echo $i
    sleep 1
done

注意,下面一次获取 1000 条数据,并进行删除,需要对数据库进行观察,可能会有 IOPS 问题,简单的观察方法,若程序执行速度快,循环快,则问题不大,若执行一次耗时多于1秒,则数据库 IOPS 会很高,可以增加循环次数,减少 limit 数

#!/bin/bash

BAK="klvchen.goods_detail_img_20210127"        # 备份删除数据的表
PRO="klvchen.goods_detail_img"                 # 需要删除的表

# 删除 9060000 多数据
for((i=0;i<=906;i++))do
     mysql -h XXXXXX -uXXXXXX -pXXXXXX -e "delete from ${PRO} where id in(select B.id from (select id from ${BAK} limit `expr $i \* 10000`, 10000) as B);"
     sleep 2
done
posted @ 2021-01-30 11:16  klvchen  阅读(201)  评论(0编辑  收藏  举报