#!/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