MySQL基准测试(二)--方法

目的:

方法不是越高级越好。而应该善于做减法。至简是一种智慧,首先要做的是收集MySQL的各状态数据。收集到了,不管各个时间段出现的问题,至少你手上有第一时间的状态数据,而不是凭空想象的去做剖析和分析问题。

数据模拟参考

仿真多线程插入和查询语句,可以参考Python模拟数据(MySQL数据库)文档

MySQL状态命令的解释

  • SHOW GLOBAL VARIABLES 查看目前的MySQL的各个参数变量值。
  • SHOW GLOBAL STATUS 查看全局的MySSQL的状态信息。
  • SHOW FULL PROCESSLIST 查看当前MySQL当前进程运行的具体信息。
  • SHOW ENGINE INNODB STATUS 查看InnoDB当前的状态信息

备注:

当MySQL出现瞬时负载升高,IO负载增大的时候。SHOW FULL PROCESSLISTpager more联用,可以立马查到当前MySQL线程中的一些问题。现在可以把SHOW FULL PROCESSLIST 封装成一个脚本来执行,效果更佳。也说明MySQL的状态值的收集的重要性!

脚本封装

碰到问题,快速定位问题,把上述的状态命令进行封装。定位查找,脚本如下:

备注:

这里将来会写一个MySQL线上环境的一个实例《xxxxx》,来解释MySQL服务间歇性问题,如:MySQL服务卡壳或者慢查询。

  • exec_mysql_processlist.sh 打出当前进程运行的具体信息
#!/bin/sh
file=$(date +%F_%H_%M_%S)
PREFIX=ZMySQL-edition
loadavg="$(uptime)"
ts="$(date +"TS %s.%N %F %T")"
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW FULL PROCESSLIST\G' >> $PREFIX-${file}-processlist
  • exec_mysql_status.sh 打出当前MySQL的状态信息
#!/bin/sh
file=$(date +%F_%H_%M_%S)
PREFIX=ZMySQL-edition
loadavg="$(uptime)"
ts="$(date +"TS %s.%N %F %T")"
echo "$ts $loadavg" >> $PREFIX-${file}-status
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW GLOBAL STATUS' >> $PREFIX-${file}-status
  • exec_mysql_innodbstatus.sh 打出当前MySQL Innodb存储引擎的状态信息
#!/bin/sh
file=$(date +%F_%H_%M_%S)
PREFIX=ZMySQL-edition
loadavg="$(uptime)"
ts="$(date +"TS %s.%N %F %T")"
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW ENGINE INNODB STATUS\G' >> $PREFIX-${file}-innodbstatus

脚本收集

  • collect_mysql.sh 每5秒收集上述各个状态命令的相关信息,并输出到文件中,后续可以用awk等其他格式化命令来分析日志文件,并画图变现出来。
#!/bin/sh
INTERVAL=5
PREFIX=$INTERVAL-sec-status
RUNFILE=/data/mysqldata/running
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW GLOBAL VARIABLES' >> mysql-variables
while test -e $RUNFILE; do
file=$(date +%F_%H)
sleep=$(date +%s.%N | awk "{print $INTERVAL -(\$1 % $INTERVAL)}")
sleep 5
ts="$(date +"TS %s.%N %F %T")"
loadavg="$(uptime)"
echo "$ts $loadavg" >> $PREFIX-${file}-status
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW GLOBAL STATUS' >> $PREFIX-${file}-status &
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW ENGINE INNODB STATUS\G' >> $PREFIX-${file}-innodbstatus &
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
/usr/local/mysql/bin/mysql -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock -e 'SHOW FULL PROCESSLIST\G' >> $PREFIX-${file}-processlist &
echo $ts
done
echo Exiting because $RUNFILE does not exist.

收集日志的输出结果

[root@racnode1 scripts]# ls -l
total 63192
-rw-rw-r-- 1 mysql mysql 5504846 Jun 15 18:00 5-sec-status-2018-06-15_17-innodbstatus
-rw-rw-r-- 1 mysql mysql 436374 Jun 15 18:00 5-sec-status-2018-06-15_17-processlist
-rw-rw-r-- 1 mysql mysql 7169459 Jun 15 18:00 5-sec-status-2018-06-15_17-status
-rw-rw-r-- 1 mysql mysql 2695460 Jun 15 18:26 5-sec-status-2018-06-15_18-innodbstatus
-rw-rw-r-- 1 mysql mysql 212897 Jun 15 18:26 5-sec-status-2018-06-15_18-processlist
-rw-rw-r-- 1 mysql mysql 3512080 Jun 15 18:26 5-sec-status-2018-06-15_18-status

其中三个不同的文件分别为MySQL status,processlist和innodb status的具体信息。

脚本分析

  • analyze 分析上述生成的文件如:5-sec-status-2018-06-15_17-status,变成一个固定格式,用于图片输出
#!/bin/sh

awk '
BEGIN{
printf "#ts date time load QPS";
fmt = " %.2f";
}
/^TS/{
ts = substr($2,1,index($2,".")-1);
load = NF - 2;
diff = ts - prev_ts;
prev_ts = ts;
printf "\n%s %s %s %s",ts,$3,$4,substr($load,1,length($load)-1);
}
/Queries/{
printf fmt,($2-Queries)/diff;
Queries=$2
}
' "$@"

分析日志的输出结果

[root@racnode1 scripts]# ./analyze 5-sec-status-2018-06-15_17-status >>QPS-5-sec-0615
  • 日志信息如下:
#ts date time load QPS
1529053574 2018-06-15 17:06:14 0.49 0.00
1529053579 2018-06-15 17:06:19 0.53 1.00
1529053584 2018-06-15 17:06:24 0.49 1.20
1529053622 2018-06-15 17:07:02 0.52 0.39
1529053627 2018-06-15 17:07:07 0.48 1.20
1529053632 2018-06-15 17:07:12 0.44 1.20

画图

gnuplot为一个制图开源工具。可以通过yum install gnuplot安装。

  • gnuplot_mysql_status.sh 画图,并生成一个为MySQL_STATUS.png的图片。
#!/bin/bash
TITLE="MySQL_GLOBAL_STATUS"
OUTPUT="MySQL_STATUS.png"
PLOT="plot 'QPS-5-sec-06161735' using 4 title'LOAD' w lines,\
'QPS-5-sec-06161735' using 5 title 'QPS' w lines"
YRANGE="[0:]"
gnuplot << EOF
set terminal png small size 480,360
set title "$TITLE"
set xtics 60
# set mxtics 720
set yrange $YRANGE
set grid
set output "$OUTPUT"
$PLOT
EOF
  • 图片如下:

MySQL基准测试(二)--方法的更多相关文章

  1. 二.误删除MySQL用户,恢复方法

    误删除MySQL用户导致无法进入数据库 一.方法一 1.停止数据库 [root@db02 ~]# /etc/init.d/mysqld stop 2.跳过授权表,跳过网络启动数据库 [root@db0 ...

  2. 详解MySQL基准测试和sysbench工具

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  3. Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

    什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...

  4. 详解MySQL基准测试和sysbench工具(转)

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  5. MySQL基准测试和sysbench工具

    参考https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html 一.基准测试的作用 sysbench是一个开源的.模块化的.跨平台的 ...

  6. 解MySQL基准测试和sysbench工具

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  7. 查看mysql数据库版本方法总结

    当你接手某个mysql数据库管理时,首先你需要查看维护的mysql数据库版本:当开发人员问你mysql数据库版本时,而恰好你又遗忘了,那么此时也需要去查看mysql数据库的版本............ ...

  8. linux忘记mysql密码找回方法

    linux忘记mysql教程密码找回方法 今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦.    方法一: # /etc/init. ...

  9. (转载)查看三种MySQL字符集的方法

    (转载)http://database.51cto.com/art/201010/229171.htm MySQL字符集多种多样,下面为您列举了其中三种最常见的MySQL字符集查看方法,该方法供您参考 ...

随机推荐

  1. java多线程系列9 高级同步工具(3) CyclicBarrier

    CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)   然后一再执行 public class CyclicBar ...

  2. Django的学习进阶(二)———— name

    一.问题: 在做完第一个demo的时候,由于只是基础学习,所以对于name的使用并不需要很熟练,也不用理解的很深.但是在做音乐网站的时候遇到了关于如何使用name的内容. 由于一个app中会使用到另一 ...

  3. Java输入输出流详解

    通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都统一抽象为数据流.Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为 ...

  4. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  5. Python之路(一)-python简介

    一.python简介,python2.x与python3.x的区别 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Py ...

  6. Alpha 冲刺(1)

    Alpha 冲刺 (1/10)   Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 ...

  7. unity 简单通用游戏模式设计

    好吧好吧,又谈到这个问题了,其实早就想写这个博客了,犹豫了好久.在设计游戏的时候我本人是很排斥什么游戏架构设计,mvc什么的,我只想马上动手就把自己的游戏玩法最快的用代码敲出来,还不会出无法挽回的错误 ...

  8. Mac键盘按键符号

    通过修饰键来查看 像command.option.control.shift这些按键在Mac下叫做修饰键,一般情况下他们大都用来辅助输入或者用作快捷键的修饰键. 打开“系统偏好设置”,点击“键盘→键盘 ...

  9. Android 和 iOS 实现录屏推流的方案整理

    一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...

  10. 在jsp的js和css里面使用EL表达式取值|style里面用$取值

    众所周知,如果直接在jsp的js或者css语句块里面写${***}取值的话,程序会不识别这玩意,但是,我们有时候确实需要动态取值,比如,js为了获得对象的某一个值,不方便用js的getElementB ...