shell统计mysql分表大小

说明:
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文件里相同表名的数据累加。
原理大概就这样,实现的方法比较傻。。。。。后面考虑换成数据来实现!

发表评论

邮箱地址不会被公开。 必填项已用*标注