# -*- coding:utf8 -*-
'''
Created on 2017年1月9日 @author: qiancheng
''' import re
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import subprocess
import time
import sys
import threading class mail_to:
def __init__(self,_message,_file):
self.msg=_message
mail_host="x.x.x.x" #smtp-server
mail_user="qiancheng" #username
mail_pass="xxxxxxx" #password
sender = 'qiancheng@showjoy.com'
receivers = ['qiancheng@showjoy.com']
#receivers = ['qiancheng@showjoy.com']
message = MIMEMultipart()
message['From'] = Header("qiancheng@showjoy.com<qiancheng@showjoy.com>")
message['To'] = Header("qiancheng@showjoy.com<qiancheng@showjoy.com>")
#message['To'] = Header("qiancheng@showjoy.com<qiancheng@showjoy.com>")
#邮件标题
subject = '本周慢查询日志'
message['Subject'] = Header(subject,'utf-8')
#邮件正文
message.attach(MIMEText(self.msg,'plain','utf-8'))
#txt附件
mail_file=open(_file,'rb')
load=MIMEText(mail_file.read(),'base64','utf-8')
load['Content-Type']='application/octet-stream'
load["Content-Disposition"] = 'attachment; filename="slow.log.txt"'
message.attach(load) try:
smtpObj=smtplib.SMTP()
smtpObj.connect(mail_host)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
smtpObj.close()
mail_file.close()
except smtplib.SMTPException:
print("Error: 无法发送邮件") class analysis_log(object):
def __init__(self,_dbname,_filename,_wfilename):
self.db_name=_dbname
self.wfilename = _wfilename
self.filename = _filename
def do_openfile(self):
if os.path.exists(self.filename):
f=open(self.filename, 'r')
w=open(self.wfilename,'w')
start_value=0
continue_value=0
while True:
line=f.readline()
if line:
check_start = self.do_analysis(line) if check_start == 'success_app_success':
start_value=1
if check_start == 'success_app_fail':
start_value=0
continue
if check_start == 'fail':
continue_value=1
if re.search('timedate',check_start) != None and start_value == 1 and continue_value == 0:
w.write(check_start)
continue
if start_value == 1 or (start_value == 1 and continue_value == 1):
#print check_start
w.write(line)
else:
continue
else:
break
f.close()
w.close()
self.mail_to_someone()
else:
print (self.filename+"not exists")
def do_analysis(self,_line):
if re.search('SET timestamp',_line) == None:
if re.search('User@Host',_line) == None:
result='fail'
else:
result='success'
if re.search(self.db_name+'\['+self.db_name+'\]',_line) == None:
result= result+'_'+'app_fail'
else:
result= result+'_'+'app_success'
return result
else:
#timestamp=_line.split('=')[-1]
timestamp=float(re.findall('\d+',_line)[-1])
_time = time.localtime(timestamp)
d=str(time.strftime("%Y-%m-%d %H:%M:%S",_time))
return 'SET timedate='+d+'\n'
def mail_to_someone(self):
mail_to('程序产生的慢查询日志,'+self.db_name+'数据库',self.wfilename)
if __name__ == '__main__': for dbname in sys.argv:
if dbname == 'shop':
file_name='C:\\work\\showjoy\\S-C12-slow.log'
wfile_name='C:\\work\\showjoy\\S-C12-slow.log.txt'
#subprocess.call('scp root@s-c12:/usr/local/mysql/data/dbdata_3310/S-C12-slow.log /tmp/S-C12-slow.log',shell=True)
#subprocess.call('ssh root@s-c12 \'echo "" > /usr/local/mysql/data/dbdata_3310/S-C12-slow.log\'',shell=True)
analysis1=analysis_log(dbname,file_name,wfile_name)
t1=threading.Thread(target=analysis1.do_openfile())
elif dbname == 'trade':
file_name='C:\\work\\showjoy\\S-C9-slow.log'
wfile_name='C:\\work\\showjoy\\S-C9-slow.log.txt'
#subprocess.call('scp root@s-c12:/usr/local/mysql/data/dbdata_3310/S-C12-slow.log /tmp/S-C12-slow.log',shell=True)
#subprocess.call('ssh root@s-c12 \'echo "" > /usr/local/mysql/data/dbdata_3310/S-C12-slow.log\'',shell=True)
analysis2=analysis_log(dbname,file_name,wfile_name)
t2=threading.Thread(target=analysis2.do_openfile())
else:
print ("请输入数据库名字,如shop,trade。空格隔开!")
日志处理,timstamp 转换成datetime,把提取shop,这种程序跑出来的sql,去除root和其他人工的语句。

python处理mysql慢查询日志的更多相关文章

  1. mysql慢查询日志分析工具 mysqlsla(转)

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  2. MySQL 慢查询日志分析及可视化结果

    MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...

  3. ELK logstash 处理MySQL慢查询日志(初步)

    写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...

  4. MySQL慢查询日志

    实验环境: OS X EI Captian + MySQL 5.7 一.配置MySQL自动记录慢查询日志 查看变量,也就是配置信息 show (global) variables like '%slo ...

  5. MySQL慢查询日志释疑总结

      之前写了一篇"MySQL慢查询日志总结",总结了一些MySQL慢查询日志常用的相关知识,这里总结一下在工作当中遇到关于MySQL慢查询日志的相关细节问题,有些是释疑或自己有疑惑 ...

  6. 企业级中带你ELK如何实时收集分析Mysql慢查询日志

    什么是Mysql慢查询日志? 当SQL语句执行时间超过设定的阈值时,便于记录到指定的日志文件中或者表中,所有记录称之为慢查询日志 为什么要收集Mysql慢查询日志? 数据库在运行期间,可能会存在这很多 ...

  7. MySQL慢查询日志相关的文件配置和使用。

    MySQL慢查询日志提供了超过指定时间阈值的查询信息,为性能优化提供了主要的参考依据,是一个非常实用的功能,MySQL慢查询日志的开启和配置非常简单,可以指定记录的文件(或者表),超过的时间阈值等就可 ...

  8. MySQL 慢查询日志配置与简析

    MySQL慢查询日志配置与简析 By:授客 QQ:1033553122   <1> 查看是否开启慢查询日志 SHOW VARIABLES LIKE 'slow%'; 说明: a. 如果sl ...

  9. (6) MySQL慢查询日志的使用

    一. 设置方法 使用慢查询日志里捕获 启用之前需要先进行一些设置 方法一:全局变量设置 设置慢查询日志的日志文件位置 set global slow_query_log_file = "D: ...

随机推荐

  1. lightoj 1011 最大权重匹配或最大费用流

    由于暂时不会KM算法,只能用最大费用流来做了. 题目链接:http://lightoj.com/volume_showproblem.php?problem=1011 #include <cst ...

  2. G - Shuffle'm Up

    题目大意: 是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不 ...

  3. MyBatis(4):动态SQL

    什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...

  4. Struts2 入门(新手必看)

    船舶停靠在港湾是很安全的,但这不是造船的目的     Struts 2及其优势 Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点 Struts ...

  5. Android中的双向链表

    1.看源代码必须搞懂Android的数据结构.在init源代码中双向链表listnode使用非常多,它仅仅有prev和next两个指针,没有不论什么数据成员.这个和linux内核的list_head如 ...

  6. RESTEasy + JBOSS 7 Hello world application---reference

    RESTEasy is JBOSS provided implementation of JAX-RS specification for building RESTful Web Services  ...

  7. ubuntu12.10中没有/etc/inittab文件探究

    1. 我们首先来看一下Linux系统开机启动过程: Ubuntu是Linux系统的衍生系统,其开机启动过程与上图相差不大,但是随着系统的不断发展,终究还是有不同的地方,下面,我们来了解一下Ubuntu ...

  8. 判断textview是否被截断

    Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) i ...

  9. HDU 3037(Lucas定理)

    对于很大的组合数不能用C(n, m) = C(n - 1, m) + C(n-1, m -1)来求,这里就用到Lucas定理. 模板题: hdu3037:模板如下: #include <cstd ...

  10. 【开源java游戏框架libgdx专题】-15-系统控件-Button类

    Button类继承与Actor类,可以在舞台中使用,但是它也继承了许多Actor的子类,如Group.Table.WidgetGroup灯. 常用构造方法: Button():创建按钮对象,不设置其样 ...