分析Mysql慢日志脚本及快速定位慢Sql

分析Mysql慢日志是运维工作中,不可少的。要快速定位慢Sql,以及发现后优化Sql及修改业务,保证数据库稳定高效地工作。下面是我工作中解决的思路...

1.先查看本地数据库慢日志文件

2.编写分析慢日志脚本

#!/usr/bin/python
#coding=utf-8  #字符编码
import re  #导入正则匹配模块
import time #导入时间模块
import sys  #导入sys模块
import MySQLdb #导入连接mysql模块
canshu=len(sys.argv) #参数个数
def help():
    #帮助函数
    print "分析当天慢日志执行命令python %s today today" %sys.argv[0]
    print "分析以前慢日志执行命令python %s before 日志名字" %sys.argv[0]
def create_table():
    # 打开数据库连接
    db=MySQLdb.connect("192.168.1.1","test","test","log_fenxi")
    # 使用cursor()方法获取操作游标
    cursor=db.cursor()
    # 如果数据表已经存在使用 execute() 方法删除表。
    cursor.execute("DROP TABLE IF EXISTS `mysql_slow`;")
    # 创建数据表SQL语句
    sql="""CREATE TABLE `mysql_slow` (
      `id` int(11)  unsigned NOT NULL AUTO_INCREMENT,
      `Query_time` float(11,6) NOT NULL,
      `Lock_time` char(11) NOT NULL,
      `Rows_sent` int(11) NOT NULL,
      `Rows_examined` int(11) NOT NULL,
      `time` datetime NOT NULL,
      `slow_sql` text NOT NULL,
       PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
    cursor.execute(sql)
    # 关闭数据库连接
    db.close()
def insert_table():
    log_file=open(log_name) #读取慢日志
    # 打开数据库连接
    db=MySQLdb.connect("192.168.1.1","test","test","log_fenxi")
    # 使用cursor()方法获取操作游标
    cursor = db.cursor()
    for line in log_file:
        line=line.strip()
        Query_time=re.search(‘Query_time:(\s\d+\.\d+)‘,line) #正则匹配慢日志时间
        Lock_time=re.search(‘Lock_time:(\s\d+\.\d+)‘,line)   #正则匹配锁定时间
        Rows_sent=re.search(‘Rows_sent:(\s\d+)‘,line)    #正则匹配返回结果好多行数据
        Rows_examined=re.search(‘Rows_examined:(\s\d+)‘,line)   #正则匹配扫描好多行数据
        timestamp=re.search(‘timestamp=(\d+)‘,line)   #正则匹配时间戳
        slow_sql=re.match(‘(SELECT.*?);‘,line)   #正则匹配慢sql
        if Query_time:
           Query_time_new=Query_time.group(1).strip()  #匹配正则结果赋值
        if Lock_time:
           Lock_time_new=Lock_time.group(1).strip()  #匹配正则结果赋值
        if Rows_sent:
           Rows_sent_new=Rows_sent.group(1).strip()  #匹配正则结果赋值
        if Rows_examined:
           Rows_examined_new=Rows_examined.group(1).strip()  #匹配正则结果赋值
        if timestamp:
           timestamp=int(timestamp.group(1))
           timeArray=time.localtime(timestamp)
           sql_time=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)  #匹配正则结果赋值
        if slow_sql:
            slow_sql_new=slow_sql.group()  #匹配正则结果赋值
            # SQL 插入语句
            sql = """INSERT INTO mysql_slow(Query_time,Lock_time,Rows_sent,Rows_examined,time,slow_sql)
                VALUES ("""+Query_time_new+""","""+Lock_time_new+""","""+Rows_sent_new+""","""+Rows_examined_new+""",‘"""+sql_time+"""‘,‘"""+slow_sql_new+"""‘)""";
            try:
               # 执行sql语句
               cursor.execute(sql)
               # 提交到数据库执行
               db.commit()
            except:
               # Rollback in case there is any error
               db.rollback()
    log_file.close()
    # 关闭数据库连接
    db.close()
def main():
    global log_name
    if canshu!=3:
       print "参数数量错误,请检查!"
       help()
    else:
       create_table()
       xuanze=sys.argv[1]   #第一个参数(慢日志时间)
       log_before=sys.argv[2] #慢日志具体时间 
       if xuanze==‘today‘:
            log_name=‘/data/mysqlp/mysql-slow.log‘
            insert_table()
       elif xuanze==‘before‘:
            log_name=‘/data/logs/mysql_slow/%s‘ %log_before
            insert_table()
       else:
            print ‘参数类型选择错误,类型只包含today|before‘
            help()
main()

3.用脚本处理的结果存在数据库中,查看数据库记录。

备注:

如果想快速定位那些Sql有问题,只需要把Query_time和Rows_examined字段进行降序排序就可以定位了。可以把排序在前面的Sql手动进行查询,如果发现还是比较慢就需要优化Sql和修改业务了。

如果想用此脚本直接使用,需要修改数据库连接ip和用户密码,还需要在日志库上面安装MySQLdb模块,并且需要修改当前慢日志路径及名字/data/mysqlp/mysql-slow.log,及保留慢日志的路径/data/logs/mysql_slow,这两个路径请根据自己存储路径修改,才能正常使用此脚本!

时间: 2024-10-28 18:56:05

分析Mysql慢日志脚本及快速定位慢Sql的相关文章

优化、分析Mysql表读写、索引等操作的sql语句效率优化问题

为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主机性能>内存使用性能>网络传输性能>SQL语句执行性能[软件工程师]下面列出一些数据库SQL优化方案: (01)选择最有效率的表名顺序(笔试常考) 数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理,在FROM子句中包含多个表的情况下,你必须选择

pt-query-digest分析mysql查询日志

[[email protected] log]# pt-query-digest slowq.log # 200ms user time, 10ms system time, 24.39M rss, 205.12M vsz# Current date: Thu Dec 17 15:32:04 2015# Hostname: hank-yoon.com# Files: slowq.log# Overall: 8 total, 2 unique, 0.00 QPS, 0.00x concurrenc

Python写的分析MySQL binlog日志工具

因为MySQL数据库增删改突然暴增,需要查询是那些表的操作特别频繁,写了一个用来分析bin-log的小工具,找出增删改查的表,并按照操作次数降序排列,以下是代码: #for mysql5.5 binlog import os,sys #python binlog.py binglog-0001 '2013-07-01 00:00:00' '2013-07-02 00:00:00' def log_w(type,text):     logfile = "%s.txt" % (type,

【20180417】ELK日志管理之filebeat收集分析mysql慢日志

环境版本 filebeat: 6.2.3mysql: 5.6.38 错误信息 { "_index": "mysql-slow-2018.04.17", "_type": "doc", "_id": "AWLRiDqYhjFMCbqrK5ez", "_version": 1, "_score": null, "_source":

Android中利用icodetools工具快速定位App破解中关键点方法

icodetools工具地址:https://github.com/fourbrother/icodetools 一.前言 在前面已经介绍了icodetools工具的实现原理和具体使用规则,关于这部分的知识点还不了解的同学可以去下面两篇文章详细查看:Android中注入代码工具icodetools原理篇,Android中注入代码工具icodetools完善篇.同时这个工具已经放到github上了,感兴趣的同学可以下载尝试各种app的代码注入功能. 那么有了这两篇文章之后,现在我得实际操作了,要动

Mysql 主从复制监控脚本

Mysql 主从复制监控脚本, 监控IO和SQL线程.如果问题.发送邮件报警. #!/bin/bash #write by lijun #Date 2014-08-12 #Description monitor the master pass the data to the slave #===================== mail="邮件地址" #=================== #获取slave io 进程和sql进程的状态 b="`mysql -uroot

Mysql表读写、索引等操作的sql语句效率优化问题

上次我们说到mysql的一些sql查询方面的优化,包括查看explain执行计划,分析索引等等.今天我们分享一些 分析mysql表读写.索引等等操作的sql语句. 闲话不多说,直接上代码: 反映表的读写压力 SELECT file_name AS file, count_read, sum_number_of_bytes_read AS total_read, count_write, sum_number_of_bytes_write AS total_written, (sum_number

shell脚本分析mysql慢查询日志(slow log)

使用percona公司的pt-query-digest分析慢查询日志,分析.统计的结果的比较清晰 #!/bin/sh slowlog_path=/root/slow_query_log everyslow=/tmp/everydayslow ##需要下载pt-query-digest pt_digest=/root/pt-query-digest start_string=$(grep `date --date="0 days ago" +%y%m%d` ${slowlog_path}

MySQL慢日志查询分析方法与工具

MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询 MySQL日志文件系统的组成   a.错误日志:记录启动.运行或停止mysqld时出现的问题.   b.通用日志:记录建立的客户端连接和执行的语句.   c.更新日志:记录更改数据的语句.该日志在MySQL