之前写过一遍  可以简单对单库多表进行批量删除,但是需要每次修改具体的时间,对于多库处理也不是很友好,所以这次一并优化下。

首先我修改了具体批量删除的脚本

abcd_drop.sh

#!/bin/bashtable_arr=("a" "b" "c" "d") #所要删除的表前缀数组(不含日期)database="abcd" #所要删除的表所在的库user="root" #数据库账号password="password" #数据库密码rule="_"$(date -d  "-2 month" +%Y%m)#所要删除的表前缀的日期特征规则(修改)host="xxx.xxx.xxx.xxx" #主机ip地址(新增)for table_pre in ${table_arr[@]}do        drop_table=$(mysql -h${host}  -u${user} -p${password} -e "SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) AS statement FROM information_schema.tables WHERE table_schema = '${database}' AND table_name LIKE '${table_pre}${rule}%';"| grep -v statement)        echo ${drop_table}        mysql -h${host}  -u${user} -p${password} -e "use ${database};${drop_table}"  done注:代码修改了rule的获取从手动填写改成自动获取上上月的月份,请按照你的日期特征规则修改。

然后新增了一个前置的入口文件

#!/bin/bashstart=$(date -d  "-2 month" +%Y%m)echo "Last 2 month is "${start}read -n1 -p "Do you want to continue [Y/N]?" answercase $answer inY|y)    commands=(        "./abcd_drop.sh" "abcd_drop"    )    commands_len=${#commands[@]}    for (( i=0; i<$commands_len; i=i+2 ))    do        desc_index=i+1        desc=${commands[$desc_index]}        echo -e $desc" - starts ..."        ${commands[$i]}        if [ $? ==  0 ]; then            echo -e $desc" - ok \n"        else            echo -e $desc" - failed ! \n"        fi    done    ;;N|n)     echo "ok,good bye"    ;;*)    echo "error choice"    ;;esac注:前面几行打印了一下时间,这边时间打印主要是为了防止系统时间被篡改,需要执行前确认下,然后输入Y或者y就可以继续顺序执行单库多表的脚本。

这边代码数组里我只加了一个库脚本,如果需要多库处理按照之前abcd_drop.sh的逻辑新增脚本并添加执行命令和命令描述到drop.sh的commands数组中即可。

最后还要提醒下需要给脚本设置可执行权限,否则会有权限不足的问题。到这里我们就可以愉快的批量删除过期的多库多表了。