shell併發處理mysql數據統計備份刪除釋放

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

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

######數據庫信息
mysql_comm="/bin"數據庫

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

mysql_user="user"
#mysql_user="user"併發

mysql_passwd="passwd"
#mysql_passwd="passwd"spa

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     #####將佔位信息寫入管道
orm

####日期輸出打印
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

相關文章
相關標籤/搜索