当前位置: 首页 > news >正文

shell并发处理mysql数据统计备份删除释放

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

#!/usr/bin/bash
#define:Statistics of the database and table size
#date:20170515
#author:l

curr_dir="/data/scripts/mysql_delete"
back_dir="/backup/his_data_bak"

######数据库信息
mysql_comm="/bin"

mysql_ip="***"
#mysql_ip="***"

mysql_user="user"
#mysql_user="user"

mysql_passwd="passwd"
#mysql_passwd="passwd"

mysql_databases="db"

#####日期
today=`date +"%Y%m%d"`
Date=`date +"%Y%m%d%H%M"`

####管道并发数
cd $curr_dir
####创建管道
mkfifo tmp  

#####创建文件标示,以读写方式操作管道
exec 9<>tmp
rm tmp
#允许的进程数
THREAD_NUM=5

#预先写入指定数量的换行符,一个换行符代表一个进程,为并发线程创建相应个数的占位
{
for ((i=0;i<$THREAD_NUM;i++))
do
    echo -ne "\n" 1>&9
done 
} >&9     #####将占位信息写入管道

####日期输出打印
logdir=$curr_dir          #日志路径
log=$logdir/log.log            #日志文件 
is_font=1                #终端是否打印日志: 1打印 0不打印 
is_log=1                 #是否记录日志: 1记录 0不记录

datef(){
date "+%Y-%m-%d %H:%M:%S"
}

print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo -e "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo -e "[ $(datef) ] $1"
fi
}

####数据统计
his_data_del_cal () {
#mysql_databases=zzb_pro
print_log "数据库 $mysql_databases 开始统计数据"
Date=`date +"%Y%m%d%H%M"`
while read line
do
    print_log "数据表 $line 开始统计数据"
        table_size=`$mysql_comm/mysql  -h $mysql_ip -u$mysql_user -p"$mysql_passwd" -e "use information_schema;SELECT TABLE_NAME,concat(round(sum(DATA_LENGTH+INDEX_LENGTH)/1024/1024,2),'MB'),TABLE_ROWS FROM TABLES WHERE TABLE_SCHEMA='$mysql_databases' AND TABLE_NAME='$line'\G;"|grep -E "TABLE_NAME|DATA_LENGTH|TABLE_ROWS"|awk '{print $2}'|sed ':a;N;s/\n/ :/;ta;'|awk '{print $1,$2,$3}'`
        echo "$table_size" >>"$mysql_databases""$Date".xls
        #iconv -futf8 -tGB18030 -o "$mysql_databases"datef_bak.xls "$mysql_databases".xls
    print_log "数据表 $line 统计数据结束"
done < all_tbale.txt
#mv "$mysql_databases".xls "$mysql_databases""$Date".xls
print_log "数据库 $mysql_databases 统计数据结束"
}

#####数据备份
mysql_back() {
        print_log "需要清理的历史表开始备份"
        while read line
        do
    ####判断表是否存在
    line_tran="'$line'"
    mysql_table=`$mysql_comm/mysql -h $mysql_ip -u$mysql_user -p$mysql_passwd -e "use $mysql_databases;show tables like $line_tran\G;"|grep "Tables"|wc -l`
    if [[ $mysql_table -eq 0 ]];then
        print_log "$line 不存在,继续下一个"
        print_log "$line $mysql_table"
        continue
    else
        print_log "$line 存在,继续"
    fi
    {
    ###进程控制,读取fd9中的一个占位符
    read -u 9

        {
          $mysql_comm/mysqldump -h $mysql_ip -u$mysql_user -p$mysql_passwd $mysql_databases $line > $back_dir/$line"$today".sql
                if [[ $? -eq 0 ]];then
                        print_log "$line 备份成功"
                        cd $back_dir
                        tar -zcf $line"$today".tar.gz $line"$today".sql
                        rm -f $line"$today".sql
                else
                        print_log "$line 备份失败,退出"
                        exit 1
                fi
        echo -ne "\n" 1>&9
        ######并行执行
        }&                  
    }
        done < $curr_dir/3.txt
    ######等待上面的执行完才能执行下面的,如果上下有关联wait必须加上
    wait

        print_log "需要清理的历史表备份结束"

}

#####常量数据删除
Regular_delete () {
print_log "正规数据开始清除"
while read line 
do
{    
#进程控制
read -u 9
    {
    print_log "存储过程 $line 开始清除"
    $mysql_comm/mysql -h $mysql_ip -u$mysql_user -p$mysql_passwd  -e "use $mysql_databases;$line"
    if [[ $? -eq 0 ]];then
        print_log "存储过程 $line 清除成功"
    else 
        print_log "存储过程 $line 清除失败"
    fi
    echo -ne "\n" 1>&9
    }&
}
done< $curr_dir<storage.txt
wait
print_log "正规数据清除结束"
}

#####工作流数据删除
Wf_delete () {
print_log "工作流的表开始清除"
while read line
do
        print_log  "工作流的表 $line 开始清除"
        $mysql_comm/mysql -h $mysql_ip -u$mysql_user -p$mysql_passwd  -e "use $mysql_databases;SET foreign_key_checks = 0;CALL clear_data_by_taskid_wf($line);"
        if [[ $? -eq 0 ]];then
                print_log "$line 清除成功"
        else
                print_log "$line  清除失败"
        fi
done < $curr_dir/id.txt

$mysql_comm/mysql -h $mysql_ip -u$mysql_user -p$mysql_passwd  -e "use $mysql_databases;SET foreign_key_checks = 1;"

print_log "工作流的表清除结束"
}

#####数据空间释放
TB_space_rel() {
        print_log "开始对有删除的数据表进行空间释放"
        while read line
        do
    {
    #进程控制
    read -u 9
        {
                print_log "$line 开始释放"

                start_time=`grep -w $line|grep 开始释放|awk '{print $2,$3}'`

                start_sec=`date -d"$start_time" +%s`
                $mysql_comm/mysql -h $mysql_ip -u$mysql_user -p$mysql_passwd  -e "use $mysql_databases;optimize table $line;"
                if [[ $? -eq 0 ]];then
                        print_log "$line 释放成功"

                        end_time=$(grep -w $line|grep 释放成功|awk '{print $2,$3}')

                        end_sec=$(date -d"$end_time" +%s)

                        release_time=`echo $end_sec-$start_sec|bc`

                        print_log "数据表:$line 释放时间:$release_time"
                else
                        print_log "$line 释放失败"
                fi
                echo -ne "\n" 1>&9
        }&
    }
        done < $curr_dir/3.txt
    wait
        print_log "所有表空间释放结束"

    ####当所有任务都执行完成之后,关闭 管道
    exec 9>&-  
}

######数据统计合并至一个文件并转换成Windows格式
data_stac_merge () {
        judge_zzb_pro=$(ls -l $curr_dir/zzb_pro*|wc -l)
        if [[ $judge_zzb_pro -ne 2 ]];then
                print_log "数据统计结果有误,不是两张表,无法合并"
        else
                print_log "数据统计结果正常,开始合并转换"
                awk 'NR==FNR{a=$0;next}NR>FNR{print a,$2,$3}' $curr_dir/zzb_pro* > merge_"$today".xls
                #####文件转换,以前是tbg2312
                iconv -futf8 -tGB18030 -o merge_"$today"_bak.xls merge_"$today".xls
                print_log "数据合并转换结束"
        fi
}

#his_data_del_cal
#mysql_back
#Regular_delete
#Wf_delete
#TB_space_rel
#his_data_del_cal
#data_stac_merge

转载于:https://my.oschina.net/u/2343310/blog/901922

相关文章:

  • HDU 1255 覆盖的面积(线段树+扫描线)
  • cocos2d-x lua 中使用protobuf并对http进行处理
  • SSH防暴力破解的解决方法
  • 第三篇:一个Spark推荐系统引擎的实现
  • 2017 计蒜之道 初赛 第一场 B.阿里天池的新任务
  • C# WebApi 返回JSON
  • 可执行文件的装载
  • 自己定义控件 播放GIF动画
  • WEB服务器-Nginx之虚拟主机、日志、认证及优化
  • day06 tar命令使用,vim简单操作以及linux开机过程
  • 面面观 | 使用dokcer 构建 mariadb 数据库
  • 3 个在 Linux 中永久并安全删除文件和目录的方法
  • 再会Java
  • 自动化运维工具SaltStack详细部署
  • PHP MySQL
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Docker: 容器互访的三种方式
  • Java 最常见的 200+ 面试题:面试必备
  • JAVA之继承和多态
  • Mysql数据库的条件查询语句
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • uva 10370 Above Average
  • vue-cli3搭建项目
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 第十八天-企业应用架构模式-基本模式
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 翻译:Hystrix - How To Use
  • 前端知识点整理(待续)
  • 学习ES6 变量的解构赋值
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在Mac OS X上安装 Ruby运行环境
  • 转载:[译] 内容加速黑科技趣谈
  • ​TypeScript都不会用,也敢说会前端?
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #AngularJS#$sce.trustAsResourceUrl
  • #NOIP 2014# day.2 T2 寻找道路
  • (1) caustics\
  • (1)常见O(n^2)排序算法解析
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)插入排序
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)visual stdio 书签功能介绍
  • (转载)Linux网络编程入门
  • (转载)OpenStack Hacker养成指南
  • (转载)虚函数剖析
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上