通過shell腳本抽取MySQL實例信息

通過shell腳本抽取MySQL實例信息

這是學習筆記的第 1727 篇文章

先來為自己吹的牛來打臉,昨天計劃今天要做15件看起來複雜的事情,一天完成15件複雜的事情,截止現在完成了7件,勉強一半的節奏。

不過值得一提的是,加上今天臨時加的蠻有意義的事情,勉強還可以添上2~3件,這樣差不多是有9~10件,當然明天得把剩下的那8件完成。

說完這個,我們來看下面的兩個表格信息,你們能看出什麼潛在問題,可能字體有些小,可以點開放大來看。

一般來說,我們印象中的實例信息,基本都是CPU,內存等的系統屬性,加上歸屬的業務等信息,其實這些信息是一些概要的信息,如果我們想得到一些更細粒度的信息,從哪個維度得到呢,推薦是從實例維度。

實例維度我拆分了如下的屬性,能夠得到一個實例相對全面的信息。如果實例是比較規範的,可能得到的結果是一個比較規整的格式,看起來會有些單調的樣子。

通過shell腳本抽取MySQL實例信息

當然如果不規整,配置存在較大差異的,可能會是這種情況。

通過shell腳本抽取MySQL實例信息

從這些信息裡面,我們可以挖掘出很多待改進的信息,比如內存配置不夠合理,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


分享到:


相關文章: