這是學習筆記的第 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
閱讀更多 楊建榮的學習筆記 的文章