mysql全日志添加时间戳以及SQL多行问题处理(更新)
需求引入
在日常运维中,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多行问题处理(更新)的更多相关文章
- mysql全日志(general log)的命令名称
在源码sql/sql_parse.cc中定义 const LEX_STRING command_name[]={ { C_STRING_WITH_LEN("Sleep") }, { ...
- MySQL 表中添加 时间戳 字段
场景: 有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步. 解决方法: alter table quant_stk_calc_d_wxcp add upd ...
- mysql通过查看跟踪日志跟踪执行的sql语句
在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢? 其实方法很简单,开启mysql的日志log功能,通过查看跟踪日志即可. 开启mysql的日志log方法: wind ...
- MySQL慢日志查询全解析:从参数、配置到分析工具【转】
转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbap ...
- MySQl之最全且必会的sql语句
创建一个名称为mydb1的数据库,如果有mydb1数据库则直接使用,如果无则创建mydb1数据库 create database if not exists mydb1; create databas ...
- mysql错误日志及sql日志的区别
my.ini # power by phpStudy 2014 www.phpStudy.net 官网下载最新版 [client] port=3306 [mysql] default-characte ...
- MySQL binlog日志操作详解
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. bi ...
- MySQL慢日志简介及Anemometer工具介绍
作者:王航威 - fordba.com 来源:http://fordba.com/box-anemometer-visual-mysql-slow.html,叶师傅对原文内容略有调整 备注:王航威是知 ...
- 神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!
前言 开心一刻 某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了.一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道 ...
随机推荐
- zoj 1539 Lot 简单DP 记忆化
Lot Time Limit: 2 Seconds Memory Limit: 65536 KB Out of N soldiers, standing in one line, it is ...
- jsp web JavaBean MVC 架构 EL表达式 EL函数 JSTL
一.JavaBean概念(非常重要) 1.JavaBean就是遵循一定书写规范的Java类型(开发中:封装数据) a.必须有默认的构造方法,类必须是public的 public class ...
- html阶段测试
1.简述src和href的区别? 2.在html页面的head中定义属性<meta http-equiv="X-UA-Compatible" content="IE ...
- PE格式第五讲,手工添加节表
PE格式第五讲,手工添加节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 首先我们要用汇编编写一段汇编代码,用来生成 ...
- win10 uwp 关联文件
有时候应用需要打开后缀名为x的文件,那么如何从文件打开应用? 首先,需要打开 Package.appxmanifest 添加一个功能,需要添加最少有名称,文件类型. 上面的图就是我添加jpg 的方法, ...
- vue——实例方法 / 数据
目录 1.vm.$set 2.vm.$watch 3.vm.$delete 1.vm.$set 哎呀呀,周五啦,大家应该都很开心吧,放假了可以好好休息休息啦,然而小颖明天要面试,所以小颖今天就回去放了 ...
- .NET采集数据,放入数据库总结
第一次做采集Json的还简单一些但是XML的简直了......... JSON //采集数据 public string GetBetRecordToRepository()//随便你返回什么 { t ...
- 升级fedora 18到fedora 19
猫终于发布了,之前看过gnome 3.8的介绍视频,感觉比3.6比起来要好太多了,所以很期待,全新安装也太麻烦,所以准备升级安装.fedora提供有升级工具fedup,升级起来还是比较方便的.下面结合 ...
- LeetCode 605. Can Place Flowers (可以种花)
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...
- PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...