需求引入

在日常运维中,DBA可能经常会查看某个Query_Id对应哪些SQL,例如追查大事务问题;也可能业务端需要查看某时间端内所有SQL。

然而mysql在输入全日志的时候没有在每行SQL前打印时间戳,对于存在多行的SQL也没有处理,故需要额外的工具解决这个问题,

为此写了这个脚本。

处理脚本

主要操作类:

1、完成换行补齐

2、时间戳添加

#!/usr/bin/env python26
#-*- coding:utf-8 -*-
import os
import sys
import re query_key_list = ["Sleep","Quit","Init DB","Query","Field List","Create DB","Drop DB","Refresh","Shutdown","Statistics","Processlist","Connect","Kill","Debug","Ping","Time","Delayed insert","Change user","Binlog Dump","Table Dump","Connect Out","Register Slave","Prepare","Execute","Log Data","Close stmt","Reset stmt","Set option","Fetch","Daemon","Error"] class MySQL_Log_Parse(object):
logfile_path=""
time_prefix="" query_key = "" def __init__(self,logfile_path,output_file):
self.logfile_path = logfile_path
if not output_file:
self.logfile_parsed_path = logfile_path+"_tmp"
else:
self.logfile_parsed_path = output_file self.logfile_parsed = open(self.logfile_parsed_path,"w")
self.query_key = '|'.join(query_key_list) def _sql_completed(self,sql_log):
re_key = "(^\d{6} \d{2}:\d{2}:\d{2})?( )*\d* "+self.query_key pattern = re.compile(re_key)
match = pattern.search(sql_log) if match:
return True
return False
def _print_line(self,sql_log):
time_parttern = re.compile(r'^\d{6} \d{2}:\d{2}:\d{2}')
match = time_parttern.search(sql_log) if match:
new_line = sql_log.strip()
self.time_prefix = match.group() else:
new_line = self.time_prefix+" "+sql_log.strip()
self.logfile_parsed.write(new_line+'\n') def log_parse(self):
try:
logfile = open(self.logfile_path,"r") time_prefix = "" first_line = True
total_sql = "" for line in logfile.readlines():
sql_is_completed = self._sql_completed(line) if first_line:
total_sql = line
else:
if sql_is_completed:
self._print_line(total_sql)
total_sql = line
else:
total_sql = total_sql.rstrip() +" "+line.strip()
first_line = False
self._print_line(total_sql) except Exception, e:
print e
finally:
logfile.close()
self.logfile_parsed.close()

入口:

#!/usr/bin/env python26
#-*- coding: utf-8 -*-
import re
import sys
import os
import getopt
from GeneralLogParser import * def usage():
help_msg='''Usage: ./mysql_log_parser.py [option][value]...
-h or --help
-s or --source_log="原始general log"
-o or --output_file = "添加时间戳以及多行处理后的log,默认是在原始general log路径后加_parsed后缀"'''
print help_msg
return 0 def option_parse(argv):
shortargs = 'hs:o:'
longargs = ['help','source_log=','output_file'] opts_list,args = getopt.getopt(argv,shortargs,longargs) source_log = None
output_file = None for opt,arg in opts_list:
if opt in ('-h','--help'):
usage()
sys.exit()
elif opt in ('-s','--source_log'):
source_log = arg
elif opt in ('-o','--output_file'):
output_file = arg
return source_log,output_file def main():
if len(sys.argv) == 1:
usage()
sys.exit(1)
source_log,output_file = option_parse(sys.argv[1:]) mysql_log = MySQL_Log_Parse(source_log,output_file)
mysql_log.log_parse() if __name__ == "__main__":
main()

后续工作

1、多线程分块读取并发转换

2、代码规范化

3、mysql  打印日志过程分析

mysql全日志添加时间戳以及SQL多行问题处理(更新)的更多相关文章

  1. mysql全日志(general log)的命令名称

    在源码sql/sql_parse.cc中定义 const LEX_STRING command_name[]={ { C_STRING_WITH_LEN("Sleep") }, { ...

  2. MySQL 表中添加 时间戳 字段

    场景: 有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步. 解决方法: alter table quant_stk_calc_d_wxcp add upd ...

  3. mysql通过查看跟踪日志跟踪执行的sql语句

    在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢? 其实方法很简单,开启mysql的日志log功能,通过查看跟踪日志即可. 开启mysql的日志log方法: wind ...

  4. MySQL慢日志查询全解析:从参数、配置到分析工具【转】

    转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbap ...

  5. MySQl之最全且必会的sql语句

    创建一个名称为mydb1的数据库,如果有mydb1数据库则直接使用,如果无则创建mydb1数据库 create database if not exists mydb1; create databas ...

  6. mysql错误日志及sql日志的区别

    my.ini # power by phpStudy 2014 www.phpStudy.net 官网下载最新版 [client] port=3306 [mysql] default-characte ...

  7. MySQL binlog日志操作详解

    MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. bi ...

  8. MySQL慢日志简介及Anemometer工具介绍

    作者:王航威 - fordba.com 来源:http://fordba.com/box-anemometer-visual-mysql-slow.html,叶师傅对原文内容略有调整 备注:王航威是知 ...

  9. 神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!

    前言 开心一刻 某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了.一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道 ...

随机推荐

  1. Access-Control-Allow-Origin与Ajax跨域

    问题 在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在response中添加 Access-Control-Allow-Origin 的header,才能让前者成功 ...

  2. Echarts数据可视化series-effectscatter特效散点图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  3. DevOps之服务手册

    唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <DevOps服务手册(Manual)> <IT资源目标化>1.设施和设备(I ...

  4. configparser模块(拷贝)

    该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 创建文件 来看一个好多软件的常见文档格式如下: [DEFAULT] ...

  5. SpringMvc 关于 EXCEL

    概述 我在使用SpingMvc 的EXCEL的发现传统的 AbstractJExcelView jexcel api已经过时 AbstractView poi Api 通过阅读官方文档发现建议我们使用 ...

  6. js代码执行顺序问题

      前  言 LiuDaP 今天就给大家介绍一个特别基础的东西,javascript中函数的一点儿小知识(js代码的执行顺序),希望对大家有那么一点点帮助吧!!! 一.js--->单线程 严格意 ...

  7. SQL&SQLite

    注册博客园有一年多了,每次都是来找点资料,从来没有写过点什么,促使我开始写博客的原因主要有两点 一是在查找资料的过程中,经常需要重复的查找某个知识点,一个知识点时间长了之后总是忘记,这样重复的过程却是 ...

  8. 《从零玩转JavaWeb+项目实战》-系列课堂录制计划

    点击试听课程 前言 很多自学编程的同学经常和我说想学一门语言自己到网上找一些教程看到一半就像背单词背到ambulance一样坚持不下去了....究其原因基本上都是:内容太多,太枯燥,专业术语听不懂,学 ...

  9. USACO奶牛赛跑(逆序对)

    Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...

  10. 如何用php写app接口[原创]

    人生就如一列永不停止的列车,no one knows when or where to stop.总有那些美好,值得永远怀念.也总有那些希望,值得你无怨无悔的付出,追逐.去年年底带着女儿一起坐火车会湖 ...