使用shell脚本抽取MySQL表属性信息

这是学习笔记的第 1815篇文章

在最近抽取了数据库层级的信息之后,我们可以基于已有的数据做一些分析,比如那些业务属于僵尸业务,可以通过分析binlog的偏移量来得到一个初版的信息,如果在一个周期之后偏移量未发生任何变化,则可以断定没有任何数据的写入,很可能是一个空跑的业务。如果某些业务的日增长数据在1000M,结果有一天突然爆发增长到了4000M,则这种情况我们可以基于建立的模型来做出响应,而这些信息在系统层面是无法感知的。这是对于业务探索的第一步。

在这个基础上,如果某些表数据量太大,某些表数据增长过于频繁,某些表中的碎片率很高,表中的索引过度设计等,这些对于业务来说是很欢迎的,如果能够及时发现,从设计上就可以改进和完善,为后期的问题排查也提供一种参考思路。

所以简而言之,表属性的收集是一个很细粒度的工作,虽然琐碎,但是尤其重要,而这个很可能是我们DBA同学目前容易忽视的。

我写了一个初版的采集脚本。会基于数据字典information_schema.tables采集一些基础信息,对于表中的碎片分析,则是通过和系统层结合来得到的。

为了减少采集到的表数量过多,目前是优先采集数据量在100M以上的表,然后分析碎片率等。

完整的脚本如下,供参考。

ps -ef|grep mysql |grep -w mysqld|grep -v grep |grep -v infobright|awk -F'--' '{for (i=2;i<=NF;i++) {printf $i" "}printf "\n"}' > info_from_sys.tmp

memtotal=`cat /proc/meminfo |grep MemTotal|awk '{print $2}'`

#echo $memtotal

function get_info_from_sys()

{

while read line

do

array=$line

port_str='port='

socket_str='socket='

port_str='port='

socket_str='socket='

port_str='port='

socket_str='socket='

for arr_tmp in ${array[*]}; do

if [[ $arr_tmp =~ $port_str ]];then

port_tmp=`echo $arr_tmp|sed 's/port=//g'`

fi

if [[ $arr_tmp =~ $socket_str ]];then

socket_tmp=`echo $arr_tmp|sed 's/socket=//g'`

fi

done

if [ -z "$port_tmp" ];then

port_tmp=3306

fi

echo $port_tmp >> info_from_sys.lst

# echo $port_tmp $socket_tmp >> info_from_sys.lst

done < info_from_sys.tmp

}

function get_info_from_db()

{

while read line

do

port=`echo $line|awk '{print $1}'`

version=` /usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select substr(version(),1,3);" 2>/dev/null `

datadir=` /usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select @@datadir;" 2>/dev/null `

mysqldir=`cd ${datadir};cd ..;pwd`

#echo 'mysqldir=' $mysqldir

#echo 'datadir=' $datadir

datasize=`sudo du -sk $datadir|awk '{print $1}'`

mysqlsize=`sudo du -sk $mysqldir|awk '{print $1}'`

/usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select table_schema,table_name,engine,TABLE_COLLATION,table_rows,data_length,index_length,DATE_FORMAT(create_time,'%Y-%m-%d-%H-%i-%s') create_time,DATE_FORMAT(update_time,'%Y-%m-%d-%H-%i-%s')update_time from information_schema.tables where table_schema not in ('sys','infra','test','mysql','information_schema') and ENGINE='InnoDB' and data_length>1024*1024*10 ;" 1>/tmp/table.lst 2>/dev/null

while read table_info

do

#echo $table_info

database_name=`echo $table_info|awk '{print $1}'`

#echo ${database_name}

table_name=`echo $table_info|awk '{print $2}'`

#echo $table_name

tablesize=`sudo du -sk ${datadir}/${database_name}/${table_name}.ibd|awk '{print $1}'`

echo $table_info ' ' $tablesize

done </tmp/table.lst

done < info_from_sys.lst

}

function decrypt_passwd

{

tmp_passwd=$1

dec_passwd=`echo $tmp_passwd|base64 -d`

}

##MAIN

get_info_from_sys

sec_password='RHB6WUFtesttestfasdfGIwSgo='

dec_passwd=''

decrypt_passwd $sec_password

get_info_from_db

rm info_from_sys.lst

rm info_from_sys.tmp

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏idba

数据库系统中的“黑天鹅”

一 前言 纳西姆.尼古拉斯.塔勒布的经典著作《黑天鹅》中对“黑天鹅现象”的定义是

963
来自专栏java架构学习交流

java 面试,java 后端面试,数据库方面对初级和高级程序员的要求

本内容摘自 java web轻量级开发面试教程 对于合格的程序员,需要有基本的数据库操作技能,具体体现在以下三个方面。 l  第一,针对一类数据库(比如MySQ...

2307
来自专栏黑泽君的专栏

MySQL各版本的区别

MySQL 的官网下载地址:https://www.mysql.com/downloads/

2K2
来自专栏飞总聊IT

大数据时代的NoSQL

NoSQL这个词语伴随着云计算和大数据的出现也有一些时日,对于NoSQL和SQL的区别到底是什么,NoSQL自己又是什么,往往很多人还有一些困惑。这篇文章主要阐...

3446
来自专栏带你撸出一手好代码

到底该不该使用存储过程

看到《阿里巴巴java编码规范》有这样一条 ? 关于这条规范,我说说我个人的看法 我觉得用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术...

4249
来自专栏木东居士的专栏

拉链表是什么

4415
来自专栏杨建荣的学习笔记

闪回区报警引发的性能问题分析(r11笔记第11天)

自从有了Zabbix+Orabbix,很多监控都有了一种可控的方式,当然对于报警处理来说,报警是表象,很可能通过表象暴露出来的是一些更深层次的问题。这不又来一个...

36810
来自专栏Spark学习技巧

第4篇:SQL

前言 确实,关于SQL的学习资料,各类文档在网上到处都是。但它们绝大多数的出发点都局限在旧有关系数据库里,内容近乎千篇一律。而在当今大数据的浪潮下,SQL早就被...

3709
来自专栏华章科技

干货 ▏什么数据库最适合数据分析师?

数据分析师都想使用数据库作为数据仓库处理并操作数据,那么哪一款数据库最合适分析师呢?虽然网上已经有很多对各种数据库进行比较的文章,但其着眼点一般都是架构、成本、...

1053
来自专栏华章科技

R语言怎么给中文分词?

Rwordseg包依赖于rJava包。由于Rwordseg包并没有托管在CRAN上面,而是在R-Forge上面,因此在在R软件上面直接输入install.pac...

891

扫码关注云+社区

领取腾讯云代金券