前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过shell脚本抽取MySQL实例信息

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

作者头像
jeanron100
发布2018-09-29 15:07:07
1.4K0
发布2018-09-29 15:07:07
举报
文章被收录于专栏:杨建荣的学习笔记

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

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

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

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

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

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

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

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

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

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

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

通过shell脚本检测MySQL服务信息

使用shell脚本得到MySQL实例列表

新版本的信息更完整,更全面了,值得吐槽的就是,写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

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

这可能是今年唯一的一次,写完文章才发现已经过点了,后天才能看到下一篇了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档