脚本一键检测数据库以及数据库表的大小

上代码:\

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/bash
#author: xiao白
#date: 2015-11-11
#qq: 530035210
#blog: http://my.oschina.net/pwd/blog 
#查询数据库以及数据库表的大小
  
logdir=/data/log/shell          #日志路径
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
}
random=$(date "+%s")
getDbSize(){
if [[ ${#dbinfo[@]}  -eq 0  ]];then
print_log "$FUNCNAME():参数不能为空,退出函数"
return
fi
dbhost=${dbinfo[0]}
dbuser=${dbinfo[1]}
dbpasswd=${dbinfo[2]}
dbname=${dbinfo[3]}
if [[ $dbname == ""  ]];then
dbs=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd"  -e 'show databases;' |grep -v Database > /tmp/dbs_$random.txt )
print_log "开始检测->数据库IP:$dbhost"
print_log "数据库名:数据库大小"
while read line
do
db_size=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd"  -e "use information_schema ;select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data  from TABLES where table_schema='$line' \G;
"|grep data |awk '{print $2}')
echo "$line $db_size" >>/tmp/dbsize_$random.txt
done < /tmp/dbs_$random.txt
cat /tmp/dbsize_$random.txt|sort -n  -k 2 -r |column -t > /tmp/dbstring_$random.txt
print_log "\n`cat /tmp/dbsize_$random.txt|sort -n  -k 2 -r |column -t |sed "s/^/\\t\\t\\t/"`"
totalStr=$(cat /tmp/dbstring_$random.txt  |grep "M" |grep -v "0.00"  |awk '{print $2}' |sed "s/MB//g" |xargs |sed "s/ / + /g")
sum=$(echo "$totalStr" |bc)
print_log "[$dbhost]总数据库的大小:$sum MB"
else
db_size=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd"  -e "use information_schema ;select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data  from TABLES where table_schema='$dbname' \G;
"|grep data |awk '{print $2}')
print_log "开始检测->数据库IP:$dbhost"
print_log "数据库名:数据库大小"
print_log "\n\t\t\t$dbname:$db_size"
fi
rm -f /tmp/dbs_$random.txt  /tmp/dbsize_$random.txt 
}
getTableSize(){
if [[ ${#dbinfo[@]}  -eq 0  ]];then
print_log "$FUNCNAME():参数不能为空,退出函数"
return
fi
dbhost=${dbinfo[0]}
dbuser=${dbinfo[1]}
dbpasswd=${dbinfo[2]}
dbname=${dbinfo[3]}
if [[ $dbname == ""  ]];then
cat /tmp/dbstring_$random.txt  |grep "M" |grep -v "0.00"  |awk '{print $1}' > /tmp/databases_$random.txt
print_log "排除空数据,开始检测以下数据的大小: `cat /tmp/databases_$random.txt |xargs`"
dbs=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd"  -e 'show databases;' |grep -v Database > /tmp/dbs_$random.txt )
print_log "数据库名:数据库大小"
while read line
do
table_list=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd" -e "use $line ;show tables \G ;" |grep "Tables_in" |awk '{print $2}')
db_size=$(cat /tmp/dbstring_$random.txt  |grep "M" |grep -v "0.00" |grep "^$line " |awk '{print $2}')
print_log "数据库[$line]->数据库IP:$dbhost 数据库大小:$db_size 表的数量为:`echo "$table_list"|sed "s/ /\n/g" |wc -l`个"
print_log "表名  表空间大小 表索引大小"
for i in $table_list
do
tablename="$i"
table_size=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd"  -e "use information_schema;select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,  concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB   from tables where table_schema='$line'  and table_name = '$tablename' \G; " |grep "length_MB" | awk '{print $2}' |xargs  )
echo  "$tablename $table_size" >> /tmp/$random.txt
done
print_log "\n`cat /tmp/$random.txt|sort -n  -k 2 -r |column -t|sed "s/^/\\t\\t\\t/"`"
rm -f /tmp/$random.txt
done <  /tmp/databases_$random.txt
rm -f /tmp/databases_$random.txt /tmp/dbstring_$random.txt  
else
table_list=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd" -e "use $dbname ;show tables \G ;" |grep "Tables_in" |awk '{print $2}')
print_log "数据库[$line]->数据库IP:$dbhost 表的数量为:`echo "$table_list"|sed "s/ /\n/g" |wc -l`个"
print_log "表名  表空间大小 表索引大小"
for i in $table_list
do
tablename="$i"
table_size=$(mysql -h $dbhost -u$dbuser -p"$dbpasswd"  -e "use information_schema;select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,  concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB   from tables where table_schema='$dbname'  and table_name = '$tablename' \G; " |grep "length_MB" | awk '{print $2}' |xargs  )
echo  "$tablename $table_size" >> /tmp/$random.txt
done
print_log "\n`cat /tmp/$random.txt|sort -n  -k 2 -r |column -t |sed "s/^/\\t\\t\\t/"` "
rm -f  /tmp/$random.txt 
fi
}
dbinfo=("localhost" "root" "password" "")
getDbSize
getTableSize

当dbinfo第4个参数为空默认检测整个数据库的数据库以及数据库表大小:\

当第四个参数为具体的数据库时:

坚持原创技术分享,您的支持将鼓励我继续创作!