设为首页 收藏本站
查看: 575|回复: 0

[经验分享] 线上删除mysql数据脚本

[复制链接]

尚未签到

发表于 2018-10-2 11:06:02 | 显示全部楼层 |阅读模式
#!/bin/bash  

  
# 加载配置文件
  
source ./conf/mysql.conf
  
source ./conf/backup.conf
  
SHELLLOCATION=`dirname $0`
  
SHELLLOCATION=`cd "${SHELLLOCATION}" ; pwd`
  
HADOOP_CMD="${SHELLLOCATION}/bin/hadoop-1.0.4/bin/hadoop"
  

  

  
echo "选择要清理的数据库实例:"
  
select MYSQL in ${INCLUDE_MYSQL[@]};
  
do
  
    break
  
done
  
echo "您选择要清理的实例是:$MYSQL"
  

  
MYSQL_HOST=`echo $MYSQL | awk -F':' '{print $1}'`
  
MYSQL_PORT=`echo $MYSQL | awk -F':' '{print $2}'`
  

  
read -p "数据库账号:" MYSQL_USER
  
read -s -p "数据库密码:" MYSQL_PWD
  

  
TODAY=`date +"%Y%m%d"`
  
if [ ! -d ./logs/${MYSQL_HOST}/${MYSQL_PORT} ]; then
  
    mkdir -p ./logs/${MYSQL_HOST}/${MYSQL_PORT}
  
fi
  

  
# 定义一个查询数据库的方法
  
query_mysql()
  
{
  
    mysql -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT} --default-character-set=utf8 -N -e "$*" | sed "s/^//;s/$//"
  
}
  

  
# 定义一个打印日志的方法
  
printlog()
  
{
  
    echo -e $*
  
    echo -e $* >> ./logs/${MYSQL_HOST}/${MYSQL_PORT}/mysql.${TODAY}.log
  
}
  

  
# 定义一个打印删除记录日志的方法
  
print_delete_log()
  
{
  
    echo -e $*
  
    echo -e $* >> ./logs/${MYSQL_HOST}/${MYSQL_PORT}/delete.${TODAY}.log
  
}
  

  
DB_SET=`query_mysql "show databases" | egrep -E "dc_[0-9]|ga_[0-9]"`
  
FAIL_BAK_DB=()
  
for DB in ${DB_SET}; do
  
    # 如果是游戏分析1.0的数据库并且该数据库不是需要过滤的数据库,则开始清理
  
    if [[ "${DB}" =~ ^dc_[0-9]*$ && ! " ${EXCLUDE_DB_GA10[@]} " =~ " ${DB} " ]]; then
  
        DIR=data/${MYSQL_HOST}/${MYSQL_PORT}/${DB}/${TODAY}
  
        if [ ! -d ./backup/${DIR} ]; then
  
            mkdir -p ./backup/${DIR}
  
        printlog "开始扫描$DB"
  
        WAIT_DELETE_TABLE=()
  
        for TABLE in `query_mysql "use ${DB}; show tables"`; do
  
            # 遍历需要清理的表
  
            for INCLUDE_TABLE in ${DELETE_TABLE_GA10[@]}; do
  
                # 把appid替换成正则表达式
  
                INCLUDE_TABLE=`echo ${INCLUDE_TABLE} | sed 's/^/\^/;s/$/\$/'`
  
                if [[ ${TABLE} =~ ${INCLUDE_TABLE} ]]; then
  
                    TOTAL_ROW=`query_mysql "select count(*) from ${DB}.${TABLE}"`
  
                    DELETE_ROW=0
  
                    DELETE_COLUMN=""
  
                    # 如果是日表
  
                    if [[ ! `query_mysql "desc ${DB}.${TABLE} StatiTime"` == "" ]]; then
  
                        DELETE_COLUMN="StatiTime"
  
                        DELETE_ROW=`query_mysql "select count(*) from ${DB}.${TABLE} where StatiTime < unix_timestamp(date_add(now(), interval -6 month))"`
  

  
                    #如果是周表或者月表
  
                    elif [[  ! `query_mysql "desc ${DB}.${TABLE} EndDate"` == "" ]]; then
  
                        DELETE_COLUMN="EndDate"
  
                        DELETE_ROW=`query_mysql "select count(*) from ${DB}.${TABLE} where EndDate < unix_timestamp(date_add(now(), interval -6 month))"`
  
                    fi
  

  
                    if [ ${DELETE_ROW} -gt 0 ]; then
  
                        WAIT_DELETE_TABLE+=(${TABLE}.${DELETE_COLUMN})
  
                        printlog "${DB}.${TABLE} \t ${TOTAL_ROW} \t ${DELETE_ROW}"
  
                    fi
  

  
                    TOTAL_ROW=0
  
                    DELETE_ROW=0
  
                    DELETE_COLUMN=""
  
                    break
  
                fi
  
            done
  
        done
  

  
        if [ ${#WAIT_DELETE_TABLE[@]} -gt 0 ]; then
  
            read -p "是否清理历史数据:[Yes/No]" SURE
  
            if [ ${SURE} = "Yes" ]; then
  
                print_delete_log "开始清除${DB}"
  
                for WAIT_DELETE in ${WAIT_DELETE_TABLE[@]}; do
  
                    DEL_TABLE=`echo ${WAIT_DELETE} | awk -F'.' '{print $1}'`
  
                    DEL_COLUMN=`echo ${WAIT_DELETE} | awk -F'.' '{print $2}'`
  
                    mysqldump -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT} ${DB} ${DEL_TABLE} -w"${DEL_COLUMN} < unix_timestamp(date_add(now(), interval -6 month))" > ./backup/${DIR}/${DEL_TABLE}.sql
  
                    DEL_ROW=`query_mysql "set sql_log_bin=0; delete from ${DB}.${DEL_TABLE} where ${DEL_COLUMN} < unix_timestamp(date_add(now(), interval -6 month))"`
  
                    print_delete_log "${DEL_TABLE} \t ${DEL_ROW}"
  
                done
  

  
                echo "开始打包导出的sql文件!"
  
                tar -zcf ./backup/bak.tar.gz ./backup/${DIR}/*.sql
  
                echo "开始发送打包文件到hdfs,可能需要几分钟,请耐心等候!"
  
                sh backup_tools.sh "${DIR}"
  
                if [[ $? -ne 0 || `${HADOOP_CMD} fs -ls /backup/${BUSINESS_TYPE}/${CUSTOM_SUB_DIR}/${DIR}/ | grep bak.tar.gz` = "" ]]; then
  
                    print_delete_log "==========${DB}备份失败,请手动备份!=========="
  
                    FAIL_BAK_DB+=(${MYSQL}.${DB})
  
                fi
  
            fi
  
        fi
  
        print_delete_log "==========备份失败的数据库有:${FAIL_BAK_DB[@]}=========="
  
        unset WAIT_DELETE_TABLE
  
    fi
  
done



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607485-1-1.html 上篇帖子: 如何实时查看mysql当前连接数? 下篇帖子: 构建DRBD模型的MySQL高可用(HA)集群
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表