当前位置: 首页 > 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
  • Docker: 容器互访的三种方式
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python_网络编程
  • 编写符合Python风格的对象
  • 从PHP迁移至Golang - 基础篇
  • 深度学习入门:10门免费线上课程推荐
  • 自定义函数
  • nb
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • # C++之functional库用法整理
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (独孤九剑)--文件系统
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)插入排序
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)平衡树
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 6 redis操作类
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET 使用 XPath 来读写 XML 文件
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .netcore 获取appsettings
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • // an array of int
  • @KafkaListener注解详解(一)| 常用参数详解
  • [20161214]如何确定dbid.txt