设为首页 收藏本站
查看: 1196|回复: 0

[经验分享] python分析mysql-binlog,统计时间段内各表的操作次数

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-14 09:17:18 | 显示全部楼层 |阅读模式
#####注:::以下脚本中路径可能需要各位自行进行修改
dPoAAAAAAAAA&ek=1&kp=1&pt=0&bo=RgSAAm0ElwIDABk%21&su=1112068337&sce=0-12-12&rf=2-9.jpg



实现原理:
   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   #程序初始化
# :touch /tmp/binlog.dump        #程序初始化
bin_dir='/var/lib/mysql'
md5_record='/tmp/md5_code.txt'
bin_dump='/smbdir/binlog.dump'
sqe_code=`cat ${md5_record}`
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 [ $sqe_code != $binlog_seq ];then
        mysqlbinlog  --base64-output=decode-rows -v $bin_dir/mysql-bin.${zero_fill}${binlog_seq} > $bin_dump
        echo $binlog_seq > $md5_record
fi

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

1
2
3
4
5
6
7
8
9
#!/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、创建临时表:

1
2
3
4
5
6
7
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、创建统计结果表:


1
2
3
4
5
6
7
8
9
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



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/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.execute('delete from operation_count_tmp_table')
conn.commit()
cur.close()
conn.close()



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-203775-1-1.html 上篇帖子: Python正则表达式符号与方法 下篇帖子: python集合(set) python 时间段 统计
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表