mysql 通过日志统计表的增删改_MySQL根据二进制日志binlog统计每个表的添加、删除和修改次数,mysql,基于,各表,增删...

本文介绍了一个Python脚本,用于分析MySQL数据库在指定时间范围内各表的INSERT、UPDATE、DELETE操作次数。通过读取二进制日志(binlog),脚本能够跟踪并统计每个表的增删改次数。
摘要由CSDN通过智能技术生成

分析一段时间内,数据库各个表insert,update,delete的次数。脚本如下:

#!/usr/bin/env python3

# _*_ coding:utf8 _*_

from threading import Thread

from queue import Queue

from time import strptime,mktime,localtime,strftime

from pymysqlreplication import BinLogStreamReader #pip3 install mysql-replication==0.21

from pymysqlreplication.row_event import DeleteRowsEvent,UpdateRowsEvent,WriteRowsEvent

##从主库读取binlog,然后将event解析,将解析结果放队列中

class BinlogStream(Thread):

def __init__(self,

queue_logs, #队列

master_host,master_port,master_user,master_pswd, #主库配置

start_time, stop_time, #开始结束时间,格式:YYYY-mm-dd HH:MM:SS

log_file,log_pos=0, #开始binlog文件位置

only_schemas = None, only_tables = None #只监听指定的库和表,格式:['db1','db2']

):

self._Queue = queue_logs

self.connect = {'host': master_host, 'port': master_port, 'user': master_user,'passwd': master_pswd}

self.log_file,self.log_pos = log_file,log_pos

self.start_time = int(mktime(strptime(start_time, "%Y-%m-%d %H:%M:%S")))

self.stop_time = int(mktime(strptime(stop_time, "%Y-%m-%d %H:%M:%S")))

self.only_schemas,self.only_tables = only_schemas,only_tables

self.only_events = [DeleteRowsEvent, WriteRowsEvent, UpdateRowsEvent]

super(BinlogStream, self).__init__()

def insert(self,event):

for row in event.rows:

self._Queue.put({

"log_pos":event.packet.log_pos,

"log_time": strftime("%Y-%m-%dT%H:%M:%S",localtime(event.timestamp)),

"schema_table":"%s.%s" % (event.schema, event.table),

"table_pk":event.primary_key,

"op_type":"insert",

"values":row.get("values")

})

def update(self,event):

for row in event.rows:

self._Queue.put({

"log_pos":event.packet.log_pos,

"log_time": strftime("%Y-%m-%dT%H:%M:%S",localtime(event.timestamp)),

"schema_table":"%s.%s" % (event.schema, event.table),

"table_pk":event.primary_key,

"op_type":"update",

"before_values":row.get("before_values"),

"after_values":row.get("after_values")

})

def delete(self,event):

for row in event.rows:

self._Queue.put({

"log_pos": event.packet.log_pos,

"log_time": strftime("%Y-%m-%dT%H:%M:%S",localtime(event.timestamp)),

"schema_table": "%s.%s" % (event.schema, event.table),

"table_pk": event.primary_key,

"op_type": "delete",

"values": row.get("values")

})

def run(self):

stream = BinLogStreamReader(connection_settings=self.connect, server_id=999, only_events=self.only_events,log_file=self.log_file, log_pos=self.log_pos,only_schemas=self.only_schemas,only_tables=self.only_tables)

for event in stream:

if event.timestamp < self.start_time:continue

elif event.timestamp > self.stop_time:break

if isinstance(event, UpdateRowsEvent):

self.update(event)

elif isinstance(event, WriteRowsEvent):

self.insert(event)

elif isinstance(event, DeleteRowsEvent):

self.delete(event)

self._Queue.put("PutEnd.")

#读取队列中解析后的日志,然后对日志进行应用

class ReadBinlog(Thread):

def __init__(self,queue_logs):

self._Queue = queue_logs

self.insert,self.update,self.delete = {},{},{}

super(ReadBinlog, self).__init__()

def statistics(self,log):

if log["op_type"] == "insert":

self.insert[log["schema_table"]] = self.insert.get(log["schema_table"],0) + 1

elif log["op_type"] == "update":

self.update[log["schema_table"]] = self.update.get(log["schema_table"], 0) + 1

elif log["op_type"] == "delete":

self.delete[log["schema_table"]] = self.delete.get(log["schema_table"], 0) + 1

def print(self):

keys = set(self.insert.keys()).union(set(self.delete.keys())).union(set(self.update.keys()))

print("%64s\t%10s\t%10s\t%10s" % ("Table", "Insert", "Update", "Delete"))

for key in keys:

print("%64s\t%10s\t%10s\t%10s"%(key,self.insert.get(key,0),self.update.get(key,0),self.delete.get(key,0)))

def run(self):

while True:

log = self._Queue.get()

if log == "PutEnd.":break

self.statistics(log)

self.print()

if __name__ == '__main__':

master_host = "127.0.0.1"

master_port = 3306

master_user = "root"

master_pswd = "123456"

start_time = "2020-11-06 15:00:00"

stop_time = "2020-11-06 17:00:00"

log_file = "mysqlbinlog.000012"

log_pos = 0

only_schemas = None

only_tables = None

queue_logs = Queue(maxsize=10000)

BS = BinlogStream(queue_logs,master_host,master_port,master_user,master_pswd,start_time,stop_time,log_file,log_pos,only_schemas,only_tables)

RB = ReadBinlog(queue_logs)

BS.start()

RB.start()

BS.join()

RB.join()

分析结果如下:

Table Insert Update Delete

message_center.warning_log 382 1 1

message_center.dingtalk_log 3 0 0

上层应用业务对实时数据的需求,主要包含两部分内容:1、 整体数据的实时分析。2、 AB实验效果的实时监控。这几部分数据需求,都需要进行的下钻分析支持,我们希望能够建立统一的实时OLAP数据仓库,并提供一套安全、可靠的、灵活的实时数据服务。目前每日新增的曝光日志达到几亿条记录,再细拆到AB实验更细维度时,数据量则多达上百亿记录,多维数据组合下的聚合查询要求秒级响应时间,这样的数据量也给团队带来了不小的挑战。OLAP层的技术选型,需要满足以下几点:1:数据延迟在分钟级,查询响应时间在秒级2:标准SQL交互引擎,降低使用成本3:支持join操作,方便维度增加属性信息4:流量数据可以近似去重,但订单行要精准去重5:高吞吐,每分钟数据量在千W级记录,每天数百亿条新增记录6:前端业务较多,查询并发度不能太低通过对比开源的几款实时OLAP引擎,可以发现Doris和ClickHouse能够满足上面的需求,但是ClickHouse的并发度太低是个潜在的风险,而且ClickHouse的数据导入没有事务支持,无法实现exactly once语义,对标准SQL的支持也是有限的。所以针对以上需求Doris完全能解决我们的问题,DorisDB是一个性能非常高的分布式、面向交互式查询的分布式数据库,非常的强大,随着互联网发展,数据量会越来越大,实时查询需求也会要求越来越高,DorisDB人才需求也会越来越大,越早掌握DorisDB,以后就会有更大的机遇。本课程基于真实热门的互联网电商业务场景为案例讲解,具体分析指标包含:AB版本分析,下砖分析,营销分析,订单分析,终端分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。整个课程,会带大家实践一个完整系统,大家可以根据自己的公司业务修改,既可以用到项目中去,价值是非常高的。本课程包含的技术:开发工具为:IDEA、WebStormFlink1.9.0DorisDBHadoop2.7.5Hbase2.2.6Kafka2.1.0Hive2.2.0HDFS、MapReduceFlume、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.8.RELEASESpringCloud Finchley.SR2Vue.js、Nodejs、Highcharts、ElementUILinux Shell编程等课程亮点:1.与企业接轨、真实工业界产品2.DorisDB高性能分布式数据库3.大数据热门技术Flink4.支持ABtest版本实时监控分析5.支持下砖分析6.数据分析涵盖全端(PC、移动、小程序)应用7.主流微服务后端系统8.天级别与小时级别多时间方位分析9.数据库实时同步解决方案10.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS+ElementUI11.集成SpringCloud实现统一整合方案12.互联网大数据企业热门技术栈13.支持海量数据的实时分析14.支持全端实时数据分析15.全程代码实操,提供全部代码和资料16.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值