这是学习笔记的第 1727 篇文章
先来为自己吹的牛来打脸,昨天计划今天要做15件看起来复杂的事情,一天完成15件复杂的事情,截止现在完成了7件,勉强一半的节奏。
不过值得一提的是,加上今天临时加的蛮有意义的事情,勉强还可以添上2~3件,这样差不多是有9~10件,当然明天得把剩下的那8件完成。
说完这个,我们来看下面的两个表格信息,你们能看出什么潜在问题,可能字体有些小,可以点开放大来看。
一般来说,我们印象中的实例信息,基本都是CPU,内存等的系统属性,加上归属的业务等信息,其实这些信息是一些概要的信息,如果我们想得到一些更细粒度的信息,从哪个维度得到呢,推荐是从实例维度。
实例维度我拆分了如下的属性,能够得到一个实例相对全面的信息。如果实例是比较规范的,可能得到的结果是一个比较规整的格式,看起来会有些单调的样子。
当然如果不规整,配置存在较大差异的,可能会是这种情况。
从这些信息里面,我们可以挖掘出很多待改进的信息,比如内存配置不够合理,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
需要感谢这些无私的同学参与分享。
这可能是今年唯一的一次,写完文章才发现已经过点了,后天才能看到下一篇了。