内容目录
背景
之前写过一遍 MySQL批量删除指定多前缀表的方法 可以简单对单库多表进行批量删除,但是需要每次修改具体的时间,对于多库处理也不是很友好,所以这次一并优化下。
修改
首先我修改了具体批量删除的脚本
abcd_drop.sh
#!/bin/bash table_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的获取从手动填写改成自动获取上上月的月份,请按照你的日期特征规则修改。
新增
然后新增了一个前置的入口文件
drop.sh
#!/bin/bash start=$(date -d "-2 month" +%Y%m) echo "Last 2 month is "${start} read -n1 -p "Do you want to continue [Y/N]?" answer case $answer in Y|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数组中即可。
最后
最后还要提醒下需要给脚本设置可执行权限,否则会有权限不足的问题。到这里我们就可以愉快的批量删除过期的多库多表了。
[…] MySQL批量删除多库指定多前缀表的方法【升级版】 […]
学习一下
欢迎