目前数据库的监控方式很多,分为内置数据库、商业、开源三大类,各有特点;而对于mysql数据库由于其高社区活跃度的监控方式多种多样。无论采用何种监控方式,核心都是监控数据。获取综合监控数据后,成为柔性显示部分。那么今天我们就来介绍一下如何完全使用mysql自带的方法来采集监控数据,在单个系统中可以做到最快、最方便、损失最少。本文完全使用mysql自带的show命令实现获取,全面获取connects、buffercache、lock、SQL、statement、Databasethroughputs、serverconfig7的监控数据。1.连接数(Connects)最大使用连接数:showstatuslike'Max_used_connections'当前打开的连接数:showstatuslike'Threads_connected'2.NumberoftimesbufferCachehasnotbeenreadfromthebufferpool:showstatuslike'Innodb_buffer_pool_reads'从缓冲池读取的次数:showstatuslike'Innodb_buffer_pool_read_requests'缓冲池中的总页数:showstatuslike'Innodb_buffer_pool_pages_total'缓冲池中的空闲页数:showstatuslike'Innodb_buffer_pool_pages_free'Cache命中率计算:(1-Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)*100%Bufferpool使用率:((Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free)/Innodb_buffer_pool_pages_total)*100%3.等待锁的锁数:showstatuslike'Innodb_row_lock_showwaitingtimeforeachlock:'averagestatuslike'Innodb_row_lock_time_avg'检查是否有表锁:sh现在打开TABLESwherein_use>0;如果有数据,则表示有锁表,如果为空,则表示没有表锁。减去数据得到当前的统计数据。4.SQL查看mysql开关是否开启:showvariableslike'slow_query_log',ON为开启,若为OFF,设置globalslow_query_log=1开启查看mysql阈值:showvariableslike'long_query_time',根据页面传threshold参数,修改threshold设置globallong_query_time=0.1查看mysql慢sql目录:showvariableslike'slow_query_log_file'formatslowsqllog:mysqldumpslow-sat-t10/export/data/mysql/log/slow.log注意:该语句不能通过jdbc执行,属于命令行executionmeans:显示最长的10条SQL语句的执行信息,10可以修改为TOP的个数。显示信息为:执行次数、平均执行时间、SQL语句注:当mysqldumpslow命令执行失败时,慢日志会同步到本地进行格式化。5.语句数量insert:showstatuslike'Com_insert'delete数量:showstatuslike'Com_delete'update数量:showstatuslike'Com_update'select数量:showstatuslike'Com_select'6.Throughput(数据库吞吐量)发送吞吐量:showstatuslike'Bytes_sent'receivingthroughput:showstatuslike'Bytes_received'总吞吐量:Bytes_sent+Bytes_received七、数据库参数(serverconfig)显示变量八、slowSQLslowSQL是指MySQL慢查询,具体是指运行时间超过的SQLlong_query_time值。我们经常听说MySQL有二进制日志binlog、中继日志relaylog、重做回滚日志redolog、undolog等。对于慢查询,还有慢查询日志slowlog,用于记录MySQL中响应时间超过阈值的语句.慢SQL对实际生产业务的影响是致命的,因此测试人员在性能测试时监控数据库SQL语句的执行情况,为开发提供准确的性能优化建议就显得尤为重要。那么如何利用Mysql数据库提供的慢查询日志来监控SQL语句的执行情况,找出高消耗的SQL语句。下面详细介绍使用慢查询日志的步骤:确保打开慢SQL开关slow_query_log并设置慢SQL域值long_query_time这个long_query_time用来定义比多少秒慢的“慢查询”。注意单位是秒。我通过执行sql命令setlong_query_time=1将long_query_time的值设置为1,也就是执行时间超过了1秒。认为慢查询如下:查看慢SQL日志路径通过慢sql分析工具mysqldumpslow格式化分析慢SQL日志mysqldumpslow慢查询分析工具mysql安装后自带,可以通过查看参数说明./mysqldumpslow--帮助。常用用法:取出10条最常用的慢查询。/mysqldumpslow-sc-t10/export/data/mysql/log/slow.log取出3条查询时间最慢的查询。/mysqldumpslow-st-t3/export/data/mysql/log/slow.log通过这个工具可以查询哪些SQL语句是慢SQL,从而反馈给研发优化,比如加索引,应用的实现方式,etc.常见慢SQL排查Count:表示该类语句的执行次数。上图表示select语句执行了两次。Time:表示该类语句的平均执行时间(总时间)Lock:加锁时间0s。rows:单次返回1000条记录,共2次返回2000条记录。通过这个工具可以查询哪些SQL语句是慢SQL,从而反馈给研发做优化,比如加索引,应用的实现方法等。常见慢SQL排查1.不要使用子查询SELECTFROMt1WHEREid(SELECTidFROMt2WHEREname='hechunyang');在MySQL5.5版本中,内部执行计划器是这样执行子查询的:先查外表再匹配,而不是先查内表t2,当外部数据很大时,查询速度会很慢。在MariaDB10/MySQL5.6版本中,使用join关联方式进行了优化,这条SQL会自动转换为SELECTt1.FROMt1JOINt2ONt1.id=t2.id;但请注意:该优化只对SELECT有效,对UPDATE/DELETE子查询无效。在生产环境中,尽量避免使用子查询。2.避免函数索引SELECTFROMtWHEREYEAR(d)>=2016;因为MySQL不像Oracle那样支持函数式索引,即使d字段有索引,也会直接扫描全表。应该改为>SELECTFROMtWHEREd>='2016-01-01';3.用IN代替OR低效查询慢SELECTFROMtWHERELOC_ID=10ORLOC_ID=20ORLOC_ID=30;高效查询>SELECTFROMtWHERELOC_ININ(10,20,30);4.LIKE双百分号不能用于索引SELECTFROMtWHEREnameLIKE'%de%';使用SELECTFROMtWHEREnameLIKE'de%';5.分组统计可以禁止排序SELECTgoods_id,count()FROMtGROUPBYgoods_id;默认情况下,MySQL对所有GROUPBYcol1,col2...字段进行排序。如果查询包含GROUPBY并且你想避免使用排序后的结果,你可以指定ORDERBYNULL来禁用排序。使用SELECTgoods_id,count()FROMtGROUPBYgoods_idORDERBYNULL;6.禁止不必要的ORDERBY排序SELECTcount(1)FROMuseruLEFTJOINuser_infoiONu.id=i.user_idWHERE1=1ORDERBYu.create_timeDESC;使用SELECTcount(1)FROMuseruLEFTJOINuser_infoiONu.id=i.user_id;9、总结任何东西,不要太在意它的外表,而要注意内在的东西,往往华丽的外表下会有相应的负担和损失。mysql数据库的监控支持通过SQL从performance_schema库中访问对应的表数据,前提是该库已初始化并开启监控数据写入。对于监控,不是手段的多样性,而是监控的本质和需要监控的项目内容,这样才能找到适合自己项目特点的监控方式。在选择监控mysql的监控工具时,需要注意监控工具本身对数据库服务器的消耗,以免影响自身使用。
