当前位置: 首页 > 科技观察

关于MySQL通用查询日志和慢查询日志分析

时间:2023-03-19 22:50:14 科技观察

MySQL日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等,这里主要介绍两个常用的功能:通用查询日志和慢查询日志。1)通用查询日志:记录建立的客户端连接和执行的语句。2)慢查询日志:记录所有执行时间超过longquerytime秒的查询或不使用索引的查询(1)通用查询日志学习通用日志查询时,需要知道两种数据库中的常用命令:showvariableslike'%general%';可以查看当前是否启用了通用日志查询。general_log的值为ON表示启用,为OFF表示禁用(默认禁用)。显示像“%log_output%”这样的变量;查看当前慢查询日志的输出格??式,可以是FILE(存放在数据库数据文件中的hostname.log),也可以是TABLE(存放在数据库中的mysql.general_log)问题:如何打开MySQL通用查询日志,以及如何设置要输出的通用日志输出格式?开启通用日志查询:setglobalgeneral_log=on;关闭通用日志查询:setglobalgeneral_log=off;将一般日志输出设置为表:setgloballog_output='TABLE';将一般日志输出设置为文件:setgloballog_output='FILE';将一般日志输出设置为表和文件:setgloballog_output='FILE,TABLE';(注意:以上命令只对当前生效,当MySQL重启失败时,如果要使其生效,需要配置my.cnf)my.cnf文件的配置如下:general_log=1#1表示开启通用日志查询,值为0表示关闭通用日志查询log_output=FILE,TABLE#设置通用日志的输出格??式为file和table(2)慢查询日志MySQL慢查询log是MySQL提供的一种日志记录,用于记录MySQL中响应时间超过阈值的语句,具体是指运行时间超过long_query_time值的SQL会被记录在慢查询日志中(即log可以写入文件或者数据库表,如果对性能要求高,建议写入文件)。MySQL数据库默认不开启慢查询日志。long_query_time默认值为10(即10秒,通常设置为1秒),即运行时间超过10秒的语句为慢查询语句。一般来说,慢查询发生在大表(比如几百万数据量的表),查询条件的字段没有索引。这时候匹配查询条件的字段会全表扫描,比较耗时,查了long_query_time后,属于慢查询语句。问题:如何查看当前慢查询日志的开启状态?在MySQL中输入命令:showvariableslike'%quer%';主要掌握以下几个参数:(1)slow_query_log的值为ON开启慢查询日志,OFF为关闭慢查询日志。(2)slow_query_log_file的值是将慢查询日志记录到文件中(注意:默认名称为hostname.log,慢查询日志是否写入指定文件,需要指定输出日志格式slowqueryasafile,相关命令为:showvariableslike'%log_output%';查看输出格式)。(3)long_query_time指定慢查询的阈值,即语句执行时间超过阈值则为慢查询语句,默认值为10秒。(4)log_queries_not_using_indexes如果该值设置为ON,则所有不使用索引的查询都会被记录下来(注意:如果只有log_queries_not_using_indexes设置为ON,而slow_query_log设置为OFF,此时该设置不会生效,即设置生效的前提是slow_query_log的值设置为ON),一般在性能调优时临时开启。问题:设置MySQL慢查询的输出日志格式为文件或表,或两者兼而有之?使用命令:showvariableslike'%log_output%';可以通过log_output的值查看输出格式,上面的值为TABLE。当然我们也可以设置输出格式为文本,或者同时记录文本和数据库表。设置命令如下:#慢查询日志输出到表(即mysql.slow_log)setgloballog_output='TABLE';#慢查询日志只输出到文本(即:slow_query_log_file指定的文件)setgloballog_output='FILE';#慢查询日志同时输出到文本和表中setgloballog_output='FILE,TABLE';关于慢查询日志表中的数据数据格式分析:慢查询日志记录在myql.slow_log表中,格式如下:慢查询日志记录在hostname.log文件中,并且格式如下:可以看到,无论是表还是文件,都具体记录了:是慢查询的那条语句(sql_text),慢查询语句的查询时间(query_time),锁表时间(Lock_time)和扫描的行数(rows_examined)。问题:如何查询当前慢查询语句的条数?MySQL中有一个变量记录当前慢查询语句的条数:输入命令:showglobalstatuslike'%slow%';(注意:以上所有命令,如果通过MySQLshell设置参数,重启MySQL,所有设置的参数都会失效,如果想完全生效,需要将配置参数写入my.cnf文件)。补充知识点:如何使用MySQL自带的慢查询日志分析工具mysqldumpslow分析日志?按照记录条数、时间、查询时间、返回记录条数排序。ac、at、al、ar表示对应的闪回;-t表示top,后面的数据表示返回了多少条;-g后可以写正则表达式匹配,不区分大小写。上述参数含义如下:Count:414语句出现414次;Time=3.51s(1454)最长执行时间为3.51s,累计总耗时为1454s;Lock=0.0s(0)最长等待锁的时间为0s,累计等待锁的时间为0s;rows=2194.9(9097604)发送给客户端的最大行数为2194.9,累计发送给客户端的函数数为90976404(注:mysqldumpslow脚本是用perl语言写的,具体mysqldumpslow的用法会讨论稍后)提问:在实际学习过程中,我们如何知道设置的慢查询是否有效?很简单,我们可以手动生成一条慢查询语句,比如我们的慢查询log_query_time的值设置为1,那么我们可以执行如下语句:selectsleep(1);这条语句就是慢查询语句,然后我们可以查看对应的日志输出文件或表中是否有这条语句。