python分析mysql-binlog,统计时间段内各表的操作次数_2016041301

小鹏鹏装逼课堂之:统计指定时间段数据库表的操作次数。
处女作,需要大神帮忙优化。
#####注:::以下脚本中路径可能需要各位自行进行修改

实现原理:
   1、shell脚本:通过mysqlbinlog将binlog日志文件格式化输出
        定制crontab任务,定时通过向mysql传递show master status查看binlog是否变化,若发生变化则格式化输出已经切换掉的binlog文件
   2、shell脚本:定制crontab任务,通过比对md5码,查看格式化后的binlog文件是否发生改变,若发生改变,则调用python脚本进行统计

A、格式化binlog脚本:脚本名自定

#!/bin/bash
# initail progran:
# :echo 111 > /tmp/md5_code.txt     (需要初始化一下程序,有点low)
# :touch /tmp/binlog.dump               (需要初始化一下程序,有点low)
bin_dir=‘/var/lib/mysql‘
md5_record=‘/tmp/md5_code.txt‘
bin_dump=‘/smbdir/binlog.dump‘
md5_code=`cat ${md5_record} |awk ‘{print $1}‘`
md5_bindump=`md5sum $bin_dump|awk ‘{print $1}‘`
zero_fill=`mysql  -e ‘show master status‘ | grep mysql | awk ‘{print $1}‘ |grep -o ‘[0-9]\+‘ |awk -F‘[1-9]‘ ‘{print $1}‘`
binlog_seq=$((`mysql  -e ‘show master status‘ | grep mysql | awk ‘{print $1}‘ |awk -F‘0‘ ‘{print $NF-1}‘`))
if [ $md5_code != $md5_bindump ];then
        mysqlbinlog  --base64-output=decode-rows -v $bin_dir/mysql-bin.${zero_fill}${binlog_seq} > $bin_dump
        echo `md5sum $bin_dump|awk ‘{print $1}‘` > $md5_record

B、监控格式化后的binlog脚本:

#!/bin/bash
md5_record=‘/tmp/md5_code.txt‘
bin_dump=‘/data/smb_sharepath/sup_home/binlog.dump‘
md5_code=`cat ${md5_record} |awk ‘{print $1}‘`
local_md5=`md5sum $bin_dump|awk ‘{print $1}‘`
if [ $local_md5 != $md5_code ];then
    /root/scripts/binlog_analyze.py
    echo $local_md5 > $md5_record
fi

C、python统计脚本
####使用此脚本,前提
1、需安装MySQLdb模块
2、创建临时表:

Create Table: CREATE TABLE `operation_count_tmp_table` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `OPERATION` varchar(10) DEFAULT NULL,
  `Database_name` varchar(40) DEFAULT NULL,
  `Table_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=410833 DEFAULT CHARSET=utf8

3、创建统计结果表:

Create Table: CREATE TABLE `binlog_analyze` (
  `RECORD_TIME` varchar(30) COLLATE utf8_bin DEFAULT NULL,
  `DB_name` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
  `TB_name` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `OPERATION` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
  `COUNT` bigint(20) DEFAULT NULL,
  `START_TIME` varchar(30) COLLATE utf8_bin DEFAULT NULL,
  `END_TIME` varchar(30) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# Analyze mysql binlog .
import MySQLdb
bin_log_file = open(‘/tmp/binlog460.sql1‘)
method = [‘INSERT‘,‘UPDATE‘,‘DELETE‘]
id = 1
i = 1
##Connect to mysql server
try:
    conn = MySQLdb.connect(host=‘数据库地址‘,user=‘用户名‘,passwd=‘密码‘,db=‘数据库‘,port=端口)
    cur = conn.cursor()
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])
while True:
        line = bin_log_file.readline().split(‘ ‘)
        if line[0] == ‘‘:
            break
        if len(line[0]) == 7 and line[0][1] == ‘1‘:
#            print line
            if i == 1:
                begin_time = line[0][1:3]+‘-‘+line[0][3:5]+‘-‘+line[0][5:7]+‘/‘+line[1]
                i += 1
            else:
                end_time = line[0][1:3]+‘-‘+line[0][3:5]+‘-‘+line[0][5:7]+‘/‘+line[1]
#       print line,len(line)
        if len(line) > 2 and line[1] in method:
#               print line
                if line[1] == ‘UPDATE‘:
                        db_table = line[2].split(‘.‘)
                        db_name = db_table[0][1:-1]
                        table_name = db_table[1][1:-2]
                        try:
                            cur.execute(‘insert into operation_count_tmp_table values (%s,"UP_DATE",%s,%s)‘, (id,db_name,table_name))
                        except MySQLdb.Error,e:
                            print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                        if id % 1000 == 0:
                            conn.commit()
                        id += 1
                else:
                        db_table = line[3].split(‘.‘)
                        db_name = db_table[0][1:-1]
                        table_name = db_table[1][1:-2]
                        operation = line[1]
                        try:
                            cur.execute(‘insert into operation_count_tmp_table values (%s,%s,%s,%s)‘,(id,operation,db_name,table_name))
                        except MySQLdb.Error,e:
                                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                        if id % 1000 == 0:
                            conn.commit()
                        id += 1
conn.commit()
try:
    cur.execute(‘INSERT INTO binlog_analyze () SELECT now(),Database_name AS DB_name,Table_name AS TB_name,OPERATION,count(*) AS count,%s,%s FROM operation_count_tmp_table GROUP BY Database_name,Table_name,OPERATION HAVING count(*) > 500‘,(begin_time,end_time))
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])
conn.commit()
cur.close()
conn.close()
时间: 2024-10-28 22:43:20

python分析mysql-binlog,统计时间段内各表的操作次数_2016041301的相关文章

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,

mysql查询特定时间段内的数据

SET FOREIGN_KEY_CHECKS=0; -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user ( userId bigint(20) NOT NULL, fullName varchar(64) NOT NULL, userType varchar(16) NOT NULL, addedTime datetime NO

MySQL数据库 外键,级联, 修改表的操作

1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - 将所有数据存放在一张表中的弊端: 1.结构不清晰 ---> 不致命 2.浪费空间 ---> 不致命 3.可扩展性极差 ---> 不可忽视的弊端 - 类似于将所有python代码存放在一个py文件中,强耦合到一起了----> 解耦合 ----> 拆分表 - 拆分表解决以上问题.

统计文章内各个单词出现的次数

算法的思路是: 从头到尾遍历文件,从文件中读取遍历到的每一个单词. 把遍历到的单词放到hash_map中,并统计这个单词出现的次数. 遍历hash_map,将遍历到的单词的出现次数放到优先级队列中. 当优先级队列的元素个数超过k个时就把元素级别最低的那个元素从队列中取出,这样始终保持队列的元素是k个. 遍历完hash_map,则队列中就剩下了出现次数最多的那k个元素. 具体实现和结果如下: // 出现次数最多的K个单词.cpp : Defines the entry point for the

python函数 变量 递归 匿名函数 内置函数 文件操作

1 语法 #语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 #函数名要能反映其意义 返回值数=0:返回None放回值数=1:返回object放回值数>1:返回tuple 2.定义函数的三种形式 1.无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印2.有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值 3.空函数:设计代码结构 形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,

MySQL使用笔记(三)表的操作

By francis_hao    Dec 17,2016 本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可.欢迎转载,请注明出处:转载自:http://www.cnblogs.com/yinghao1991/ 参考 [1] 王飞飞 崔洋 贺亚茹<MySQL数据库应用从入门到精通(第二版)>北京:中国铁道出版社,2014年9月

分析时间段内对表的操作次数

分析某个时间段内,表的select.insert.update.delete次数.需要用到percona-toolkit包中的一个工具pt-query-digest,脚本如下: [[email protected] ~]# cat get_list.sh  #!/bin/bash set -x #slow_file=ai-db1-slow.log slow_file=$1 if [ $# != 1 ] ; then      echo "USAGE: $0 slow.log"     

MYSQL一次千万级连表查询优化

概述:交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个SQL查询关联两个数据表,一个是攻击IP用户表主要是记录IP的信息,如第一次攻击时间,地址,IP等等,一个是IP攻击次数表主要是记录每天IP攻击次数.而需求是获取某天攻击IP信息和次数.(以下SQL语句测试均在测试服务器上上,正式服务器的性能好,查询时间快不少.) 准备:查看表的行数: 未优化前SQL

基于binlog来分析mysql的行记录修改情况(python脚本分析)

最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎么样的? 但是却不需要行记录的修改内容,只需要了解 行数据的 变动情况.故也整理了下. 昨晚写的脚本,因为个人python能力有限,本来想这不发这文,后来想想,没准会有哪位园友给出优化建议. 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各