通过shell脚本抽取MySQL实例信息_技巧

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

 

先来为自己吹的牛来打脸,昨天计划今天要做15件看起来复杂的事情,截止现在完成了7件,勉强一半的节奏。

不过值得一提的是,加上今天临时加的蛮有意义的事情,勉强还可以添上2~3件,这样差不多是有9~10件,当然明天得把剩下的那8件完成。

 

说完这个,我们来看下面的两个表格信息,你们能看出什么潜在问题,可能字体有些小,可以点开放大来看。

一般来说,我们印象中的实例信息,基本都是CPU,内存等的系统属性,加上归属的业务等信息,其实这些信息是一些概要的信息,如果我们想得到一些更细粒度的信息,从哪个维度得到呢,推荐是从实例维度。

实例维度我拆分了如下的属性,能够得到一个实例相对全面的信息。如果实例是比较规范的,可能得到的结果是一个比较规整的格式,看起来会有些单调的样子。

通过shell脚本抽取MySQL实例信息_技巧_02

当然如果不规整,配置存在较大差异的,可能会是这种情况。

通过shell脚本抽取MySQL实例信息_技巧_03

从这些信息里面,我们可以挖掘出很多待改进的信息,比如内存配置不够合理,server_id的配置规范,binlog的保留周期太短,redo太小,事务隔离级别不统一,数据量< buffer_pool_size 等等。 

 

这种感觉就跟你坐着电梯一般,如果你有了全新的视角来看待已有的事物,绝对会有新的理解,相比原地踏步来说,改进的效果要好很多。 

或者说,如果你不需要关注构思的构成,让你面对一个半成品来挑毛病,找问题,我相信你肯定能有一些建议。

关于使用脚本来抽取实例信息,来来回回更新了几版,之前的链接如下:

新版本的信息更完整,更全面了,值得吐槽的就是,写shell顺手了,用其他语言写还是存在惰性去转换,以后要逐步切换思路。 

脚本内容如下:

#!/bin/bash

##得到实例明细信息##

ps -ef|grep mysql |grep -w mysqld|grep -v grep |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='

   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 $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 `

  #echo $datadir

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

  #echo $datasize

  #echo $version

  if [[ $version == '5.5' ]];then

  /usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select @@port,@@log_bin,@@innodb_buffer_pool_size,'OFF',@@datadir,@@character_set_server,@@server_id,version(),@@expire_logs_days,@@tx_isolation,truncate($memtotal/1024,0) mem_total,truncate(@@innodb_log_file_size/1024/1024,0) redo_size,'$datasize';" >> info_from_db.lst 2>/dev/null

  #echo $port

  else

  /usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select @@port,@@log_bin,@@innodb_buffer_pool_size,@@gtid_mode,@@datadir,@@character_set_server,@@server_id,version(),@@expire_logs_days,@@tx_isolation,truncate($memtotal/1024,0) mem_total,truncate(@@innodb_log_file_size/1024/1024,0) redo_size,'$datasize';" >> info_from_db.lst 2>/dev/null

  #   echo $port_tmp $socket_tmp

  fi

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='RHB6WUF1d1c5TTEzZGIwSgo='

 

dec_passwd=''

 

decrypt_passwd $sec_password

 

get_info_from_db

 

sort  info_from_db.lst|uniq > info_from_db.tmp

sort info_from_sys.lst|uniq > info_from_sys.tmp

rm info_from_db.lst info_from_sys.lst

join -j 1 info_from_sys.tmp info_from_db.tmp 

rm info_from_sys.tmp info_from_db.tmp

输出结果类似于:

列的含义分别是:端口,socket文件路径,是否开启binlog,buffer_pool大小,GTID是否开启,数据目录,字符集,server_id,数据库版本,binlog日志保留天数,事务隔离级别,内存大小,redo大小,数据量大小

对于单机多实例的情况,查看信息就非常方便直观了。

 

5720 /data/mysql_5720/tmp/mysql.sock 1 268435456 OFF /data/mysql_5720/data/ utf8 2025720 5.7.16-10-log 7 READ-COMMITTED 16080 1024 5.1

5721 /data/mysql_5721/tmp/mysql.sock 1 268435456 OFF /data/mysql_5721/data/ utf8 2025721 5.7.16-10-log 7 READ-COMMITTED 16080 1024 3.7

5722 /data/mysql_5722/tmp/mysql.sock 1 268435456 OFF /data/mysql_5722/data/ utf8 2025722 5.7.16-10-log 7 READ-COMMITTED 16080 1024 2.6

5723 /data/mysql_5723/tmp/mysql.sock 1 268435456 OFF /data/mysql_5723/data/ utf8 2025723 5.7.16-10-log 7 READ-COMMITTED 16080 1024 3.9

5724 /data/mysql_5724/tmp/mysql.sock 1 268435456 OFF /data/mysql_5724/data/ utf8 2025724 5.7.16-10-log 7 READ-COMMITTED 16080 1024 8.7

 

最后欢迎大家关注我们的开源分享项目,截止目前,已坚持分享10次,后续还有差不多10多个主题待分享。

https://github.com/jeanron100/devops_now

通过shell脚本抽取MySQL实例信息_技巧_04

需要感谢这些无私的同学参与分享。

通过shell脚本抽取MySQL实例信息_技巧_05

这可能是今年唯一的一次,写完文章才发现已经过点了,后天才能看到下一篇了。通过shell脚本抽取MySQL实例信息_技巧_06