mysql slow_log 记录和获取

需要记录慢查询,在配置文件中加入慢查询的相关配置。

/etc/my.cnf

general_log=off

log_output=table

slow_query_log=1

long_query_time=0.3

  • general_log=off      会记录所有的查询,建议关闭(set global general_log = off)
  • log_output=table     将log记录到表中
  • slow_query_log=1     开启慢查询记录
  • long_query_time=0.3  大于0.3秒的查询会被记录

配置好以后,我的做法是使用python每周读取数据库中的记录,邮件发出来以便分析。

sql如下:

SELECT
    max(user_host),
    min(start_time),
    max(start_time),
    count(*),
    sum(
        CASE
        WHEN TIME_TO_SEC(query_time) = 0 THEN
            0.3
        ELSE
            TIME_TO_SEC(query_time)
        END
    ),
    max(
        CASE
        WHEN TIME_TO_SEC(query_time) = 0 THEN
            0.3
        ELSE
            TIME_TO_SEC(query_time)
        END
    ),
    min(
        CASE
        WHEN TIME_TO_SEC(query_time) = 0 THEN
            0.3
        ELSE
            TIME_TO_SEC(query_time)
        END
    ),
    round(
        avg(
            CASE
            WHEN TIME_TO_SEC(query_time) = 0 THEN
                0.3
            ELSE
                TIME_TO_SEC(query_time)
            END
        ),
        2
    ),
    sql_text
FROM
    slow_log
WHERE
    sql_text NOT LIKE ‘%SQL_NO_CACHE%‘
GROUP BY
    LEFT (sql_text, 40)
ORDER BY
    count(*) DESC
LIMIT 20;

部分python代码如下:

for i in range(len(conn)):
            log=p.get_table(conn[i],sql)
            query_log+=‘_‘*120+‘\r\n‘
            query_log+="Slow_Log_%s:%s____%s\r\n\r\n" % (conn[i]["host"],conn[i]["port"],days)
            for n in range(len(log)): 
                query_log+="%s  %s  %s  %s  %s " % (str(log[n][3]),str(log[n][4]),str(log[n][5]),str(log[n][6]),str(log[n][7]))
                query_log+="user_host :%s    start_time :%s   end_time :%s\r\n" % (str(log[n][0]),str(log[n][1]),str(log[n][2]))
                query_log+=‘ ‘*40+squeeze(str(log[n][8]))+‘\r\n\r\n‘
                
        mail.send_mail(mail_list,mail_title,query_log)

得到的邮件部分:

Slow_Log_x.x.x.x:3306____2016-05-26

1889  704.4  33.0  0.3  0.37 user_host :x[x] @  [x]    start_time :2016-05-25 09:30:27   end_time :2016-05-26 09:16:05

select max(online_user),round(sum(online_user)/count(id)) from online where datetime >= ‘2016-05-25‘ and server_id = 27

这样就可以看到每周比较慢的查询,然后进行优化分析。

时间: 2024-10-15 15:14:48

mysql slow_log 记录和获取的相关文章

PHP获取MySql新增记录ID值的方法

今天发现用mysql_insert_id()获取到的新增记录的id不正确, 虽然发现源代码的事务写的有问题,但是最根本的原因是,我插入数据的id类型是bigint型 获取MySql新增记录ID值的方法有 1.使用语句 mysql_query("select max(id) from user",$link); 2.使用函数msyql_insert_id(); (1)mysql版 int mysql_insert_id ([ resource $link_identifier = NUL

PHP获取MySql新增记录ID值的3种方法

From: http://www.jb51.net/article/51473.htm 这篇文章主要介绍了PHP获取MySql新增记录ID值的3种方法,一般使用PHP自带函数mysql_insert_id() 即可实现,另2种方法权作特殊情况下使用,需要的朋友可以参考下 一.使用语句: 复制代码 代码如下: mysql_query("select max(id) from t1",$link); 使用此方法得到的是 id最大的值,确为最后一个值,但当多链接线程时,这个最大的id并不一定

在Linux(CentOS)上安装MySql详细记录

前记:  毕业两年了,前两天换了份工作,由以前的传统行业跳到了互联网行业.之前的公司一直在用WinServer2003+Tomcat+SqlServer/Oracle这套部署环境.对于Linux+Tomcat(或其他容器)+Mysql这套之前没用用过.所以利用这周末的我在阿里云上49元搞了个linux(centos 64位)的服务器. 刚开始先装了JDK1.6,安装了Tomcat6.0.这过程中没有遇到太大的问题, 小问题也google一下就解决了.而周六晚上开始安装Mysql,于是到今天下午为

Mysql日志记录慢查询的SQL

在日常开发当中,经常会遇到页面打开速度极慢的情况,通过排除,确定了,是数据库的影响,为了迅速查找具体的SQL,可以通过Mysql的日志记录方法. -- 打开sql执行记录功能 set global log_output='TABLE'; -- 输出到表 set global log=ON; -- 打开所有命令执行记录功能general_log, 所有语句: 成功和未成功的. set global log_slow_queries=ON; -- 打开慢查询sql记录slow_log, 执行成功的:

mysql查询分组之后获取结果集总数

相信分页查询对于很多开发者来说都是司空见惯的事情,首先按照查询条件搜索出分页列表数据和总的记录数,获取总的记录数一般是: select count(1) as total from xxx where .......... 这没有问题,但是如果查询的条件有分组group by 那这个时候获取总数就有问题了,这样是获取每个分组的总数 解决办法: select count(1) as total from ( select id from xxx where .... grouy by .....)

MySQL如何记录binlog

--MySQL如何记录binlog   -------------------------------2014/07/08 binlog文件的内容 log event    MySQL的binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Log event.不同的修改操作对应的不同的log event.比较常用的几种log event有:Query event.Row event.Xid event等.其中Query event对应的是一条SQL语句,在DDL操作和ST

记录:获取页面选中文本

html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Con

MySQL问题记录--Can&#39;t connect to MySQL server on localhost (10061)解决方法

本文mysql的安装环境为win7 64位,mysql版本为MySQL5.7 问题描述:在命令行输入 mysql -u root -p 登录mysql,返回"Can't connect to MySQL server on localhost (10061)"错误 问题原因:在一番谷歌.百度后,查到问题原因是mysql没有启动. 解决方法:1.将mysql加入到Windows的服务中.切换到mysql安装目录下的bin文件夹,命令行运行"mysqld --install&qu

如何在MySql中记录SQL日志

SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ... 查了一下资料,My SQL可以用下面方法跟踪sql 语句,以下方法以Windows平台为例,linux雷同: 1  配置my.ini文件(在安装目录,linux下文件名为my.cnf 查找到[mysqld]区段,增加日志的配置,如下示例: [mysqld]log="C:/temp/mysql.log"l