目前数据库的监控方式很多,分为内置数据库、商业、开源三大类,各有特点;而对于MySQL数据库,由于社区活跃度高,监控手段更是五花八门。无论哪种监控方式都是核心,监控数据是获取综合监控数据后的灵活展示部分。那么今天我们就来介绍下使用MySQL自带的方法来收集和获取监控数据,可以在单个系统中做到最快、最方便、损失最少。本文完全使用MySQL自带的show命令从7大方面获取监控数据:connections、buffercache、lock、SQL、statement、Databasethroughput、serverconfig。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:'平均锁等待时间like'Innodb_row_lock_time_avg'检查是否有tablelock:showopenTABLESwherein_use>0;如果有数据,则表示有锁表,如果为空,则表示没有表锁。减去得到当前的统计数据。4.SQL检查mysql开关是否开启:showvariableslike'slow_query_log',ON为开启,若为OFF则设置globalslow_query_log=1开启。查看mysql阈值:showvariableslike'long_query_time',根据页面传threshold参数,修改阈值设置globallong_query_time=0.1。查看mysql慢sql目录:showvariableslike'slow_query_log_file'。格式化慢sql日志:mysqldumpslow-sat-t10/export/data/mysql/log/slow.log。该语句不能通过jdbc执行,属于命令行执行,即显示最长的10条SQL语句的执行信息,10可以修改为TOP的个数。显示的信息有:执行次数、平均执行时间、SQL语句。当mysqldumpslow命令执行失败时,慢日志会同步到本地进行格式化。5.Quantityofstatementinsert:showstatuslike'Com_insertdeleteQuantity:showstatuslike'Com_deleteupdateQuantity:showstatuslike'Com_updateselect'Quantity:showstatuslike'Com_select'6.Throughput(数据库吞吐量)发送吞吐量:showstatuslike'Bytes_sentreceivingthroughputQuantity:showstatuslike'Bytes_receivedTotalthroughput:Bytes_sent+Bytes_received七、数据库参数(serverconfig)显示变量八、slowSQLSlowSQL是指MySQL慢查询,具体是指运行时间超过long_query_time值的SQL。我们经常听说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--help使用最多的10个慢查询./mysqldumpslow-sc-t10/export/data/mysql/log/slow.log取出查询时间最慢的3个慢查询./mysqldumpslow-st-t3/export/data/使用mysqldumpslow对mysql/log/slow.log的分析结果不会显示具体完整的sql语句,只会显示sql的组成结构。例如:SELECTFROMsms_sendWHEREservice_id=10GROUPBYcontentLIMIT0,1000;mysqldumpslow命令执行后显示:Count:2Time=1.5s(3s)Lock=0.00s(0s)Rows=1000.0(2000),vgos_dba[vgos_dba]@[10.130.229.196]SELECTFROMsms_sendWHEREservice_id=NGROUPBY内容LIMITN,Nmysqldumpslow的详细分析结果:Count:表示该类语句的执行次数,上图表示该select语句执行了两次Time:表示该类语句的平均执行时间(总时间)typeLock:锁定时间0sRows:单次返回结果数为1000条记录,两次共返回2000条记录。通过这个工具可以查询哪些SQL语句是慢SQL,从而反馈给研发做优化,比如加索引,应用的实现方法等。1)常见的慢SQL排查没有使用子查询SELECTFROMt1WHEREid(SELECTidFROMt2WHEREname='hechunyang');子查询在MySQL5中执行。匹配内表而不是先检查内表t2。当外表的数据很大时,查询速度会很慢。在MariaDB10/MySQL5.6版本中,使用join关联方式进行了优化,这条SQL会自动转换为SELECTt1。从t1加入t2在t1.id=t2.id;但请注意:该优化只对SELECT有效,对UPDATE/DELETE子查询无效。在生产环境中,尽量避免使用子查询。避免函数索引SELECTFROMtWHEREYEAR(d)>=2016;因为MySQL不像Oracle那样支持函数式索引,即使d字段有索引,也会直接扫描全表。应该改为>SELECTFROMtWHEREd>='2016-01-01'。将OR替换为IN低效查询slowSELECTFROMtWHERELOC_ID=10ORLOC_ID=20ORLOC_ID=30;高效查询>SELECTFROMtWHERELOC_ININ(10,20,30)。LIKE双百分号不能用于索引SELECTFROMtWHEREnameLIKE'%de%';使用SELECTFROMtWHEREnameLIKE'de%'。组统计可以禁用排序SELECTgoods_id,count()FROMtGROUPBYgoods_id;默认情况下,MySQL对所有GROUPBYcol1,col2...字段进行排序。如果查询包含GROUPBY并且你想避免使用排序后的结果,你可以指定ORDERBYNULL来禁用排序。使用SELECTgoods_id,count()FROMtGROUPBYgoods_idORDERBYNULL。SELECTcount(1)FROMuseruLEFTJOINuser_infoiONu.id=i.user_idWHERE1=1ORDERBYu.create_timeDESC;使用SELECTcount(1)FROMuseruLEFTJOINuser_infoiONu.id=i.user_id。九。小结1)任何事物都不要过分注重外表,而要注重内在的东西。往往在华丽的外表下会有相应的负担和损失。2)mysql数据库的监控支持通过SQL从performance_schema库中访问对应的表数据,前提是该库已经初始化,并且开启了监控数据写入。3)就监控而言,不是手段的多样性,而是了解监控的本质和需要监控的项目内容,找到适合自己项目特点的监控方式。4)在选择监控mysql的监控工具时,需要注意监控工具本身对数据库服务器的消耗,以免影响自身使用。
