2019独角兽企业重金招聘Python工程师标准>>>
#!/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