说明:
mysql通过查询information_schema里的DATA_LENGTH,INDEX_LENGTH可以知道数据库各表的大小。但如果表分成user_00,user_01….user_99这样情况的话,mysql查询出来的就是按user_00,user_01….user_99这样一个表一个表显示。(如果数据不多,把mysql导出的各表大小直接导出到excel用公式算算也很快)。显示如下:
TABLE_NAME DATA_LENGTH INDEX_LENGTH t_order 351552 120832 t_order_statistics 33604 28672 user_00 77824 0 user_01 86016 0 user_02 98304 0 user_03 73728 0 user_04 81920 0 user_05 77824 0 user_06 73728 0 user_07 81920 0 user_08 86016 0
但有时我们需要的仅仅是user这个大表的数据。因此我们需要把user_00,user_01….user_99的数据统计起来。以下通过shell实现。
具体:
1. 通过mysql自身命令获取各分表大小
# mysql -A -uroot -p -e "select TABLE_NAME,DATA_LENGTH,INDEX_LENGTH from tables where table_schema='s4_test'" information_schema > /tmp/s4_test.201503041048.txt
2. 编辑shell统计脚本
# vim static_mysql_space.sh //内容如下 #!/bin/bash # used to static mysql space # carl 20150305 1st # PATH # define some variables InputFile="s4_test.201503041104.txt" ##这里写前面导出的数据库文件 OuputFile="lala.txt" ##这里是各分表合并统计完成的大小 # function start cat /dev/null > ${OuputFile} cat ${InputFile}|while read line do echo $line|awk '{print $1}'|grep "_[0-9][0-9]" > /dev/null if [ $? == 0 ];then table=`echo $line|awk '{print $1}'|sed "s/_[0-9][0-9]//"` data_length=`echo $line|awk '{print $2}'` index_length=`echo $line|awk '{print $3}'` cat ${OuputFile}|grep -w ^${table} > /dev/null if [ $? == 0 ];then data_length_tmp=`cat ${OuputFile}|grep -w ^${table}|awk '{print $2}'` index_length_tmp=`cat ${OuputFile}|grep -w ^${table}|awk '{print $3}'` data_length=$(($data_length+$data_length_tmp)) index_length=$(($index_length+$index_length_tmp)) sed -i "s/^${table}\t.*$/${table}\t${data_length}\t${index_length}/" ${OuputFile} else echo -e "${table}\t${data_length}\t${index_length}" >> ${OuputFile} fi else echo $line >> ${OuputFile} fi done
3. 查看统计后的表,可以看到user表这些都已经合并了
# cat lala.txt //结果如下
TABLE_NAME DATA_LENGTH INDEX_LENGTH t_order 351552 120832 t_order_statistics 33604 28672 user 8024064 0 vo_common 122880 0
附录:
上面shell统计脚本原理是通过while read逐行读取第一步导出的s4_test.201503041048.txt数据库文件,如下,
t_order 351552 120832
t_order_statistics 33604 28672
user_00 77824 0
user_01 86016 0
user_02 98304 0
1. 读取第一行,t_order 351552 120832,通过echo $line|awk ‘{print $1}’|grep “_[0-9][0-9]”判断是否有数字结果,即是否是分表。
1.1 不是分表的话,就直接将那一行输出到lala.txt文件。
1.2 如包含数字,是分表的话,就截取当然行的数据,截取出表名,data_length,index_length,如user_00 77824 0就是
user 77824 0。
2. 是分表的话,就接着判断,lala.txt这个结果文件里面是不是已经存在该表
2.1 lala.txt不存在该表,表示当前行是这个分表的起始表,如user_00,就将user 当前user的data,data_length,index_length存入lala.txt
2.2 lala.txt存在该表,则表示此行是分表的后续表,这时就分别取出此行的data_length,index_length与lala.txt文件里相同表名的数据累加。
原理大概就这样,实现的方法比较傻。。。。。后面考虑换成数据来实现!