shell脚本进行数据库查询分库分表

背景:
前阵子遇到一个问题,需要从MysqL数据库查询一些数据,这些数据分布在多个数据库和表中,也就是分库分表。

按照某种规则,我们把数据存储在100个表中(10个数据库,每个数据库10个表)。
库名为:db_app_info_$i,其中$i取值为整数0~9;
表名为:t_app_info_$j,其中$j取值为整数0~9。

为了完成多表多库查询,我们需要通过shell脚本,遍历每个表进行查询,然后将查询结果保存、汇总起来。

一个例子,统计表中 type=2的记录的总数:

#!/bin/bash 
cnt=0

# execute sql stat 
for ((i=0; i<=9;i++))
do
    for ((j=0; j<=9;j++))
    do
        tmp=$(MysqL -hYourHost -PYourPort -uYourUserName -pYourPwd -s -e " select count(*) from db_app_info_$i.t_app_info_$j where `type`=2;")
        cnt=$[cnt+tmp]
    done
done

echo $cnt

exit;

第二个例子,将所有type为2的记录的tag字段取出来,tag字段的格式为:tag1|tag2|tag3。

#!/bin/bash 
#get_tag.sh
tags=''

# execute sql stat 
for ((i=0; i<=9;i++))
do
    for ((j=0; j<=9;j++))
    do
        tmp=$(MysqL -hYourHost -PYourPort -uYourUserName -pYourPwd -s -e " select tag from db_app_info_$i.t_app_info_$j where `type`=2;")
        tags=$tags'|'$tmp
    done
done

echo $tags

exit;

对于单个表的查询结果,由于一个表中有多条记录,赋值给tmp时是以空格来分隔的,因此后续处理需要将空格替换为’|’,之后再将’|’统一替换为换行符,然后排序、去重。

$ ./get_tag.sh | sed -e 's/[][]*/|/g' | sed 's/|/\n/g' | sort | uniq > tag_list.txt

于是我们就可以得到一个去重后的标签列表了。

tips: uniq去重功能,只能针对连续的多行进行去重,因此进行uniq之前需要先sort,使得相同的记录变得连续。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...