Press "Enter" to skip to content

MySQL批量删除多库指定多前缀表的方法【升级版】

内容目录

背景

之前写过一遍 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数组中即可。

最后

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

 

3 Comments

  1. daxiong
    daxiong 2018年2月17日

    学习一下

    • chenjie
      chenjie 2018年3月22日

      欢迎

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注