大量删除数据库记录
#!/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