一个python小程序找出binlog中的大事务,一个update生成了1.4G的日志和65万条记录

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: base64-output参数用来控制binlog部分是否显示出来的,指定为decode-rows表示不显示binglog部分

用到的mysqlbinlog的相关参数

–base64-output参数用来控制binlog部分是否显示出来的,指定为decode-rows表示不显示binglog部分

加了-v参数比不加-v的多了sql部分

-v和-vv的区别在于-vv增加了备注部分

问题现象

前端工程师反映做mysql数据库恢复的时候,有一个binlog,滚了3天都没动静!

我把这个binlog取过来,对其进行解析:

mysqlbinlog binlog.344605 -v --base64-output=decode-rows > ./binlog1
[root@localhost mysql]# ls -lh
total 3.2G
-rw-r--r--. 1 root   root     1.8G 7月   8 15:17 binlog1
-rw-r--r--. 1 oracle oinstall 1.4G 7月   8 14:47 binlog.344605


分析

一个binlog有1.4G,按照默认设置通常最大不超过1G。怀疑里面有大事务,因为mysql不能把一个大事务截断放到两个binlog中。

写了个python小程序找出binlog中的大事务。


[root@localhost mysql]# cat ./CheckEventLength.py 
#! /usr/bin/python3
file=open('binlog1','r+',encoding='UTF-8')
i=0
begin_num=0
commit_num=0
while True:
  line = file.readline()  # 只读取一行内容
     # 判断是否读取到内容
  if not line:
        break
  # print("%d %s" % (i,line[: 2]))
  i=i+1
  if line[: 5]=='BEGIN':
     begin_num=i
     # print('begin line is %s' % (begin_num))
  if line[: 6]=='COMMIT':
     commit_num=i
     # print('commit line is %s' % (commit_num))
     if commit_num-begin_num > 2000:
        print("Big event starts at %d ends at %d"%(begin_num,commit_num))
file.close()
[root@localhost mysql]# ./CheckEventLength.py 
Big event starts at 352870 ends at 31693367

从运行结果看,这个binlog中基本就一个事务,一个事务1.4G,厉害呀!看看里面执行的SQL,是update语句改了若干万条记录,从SQL语句看好像在做网站迁移。


[oracle@localhost mysql]$ grep "UPDATE \`gdjcyht\`.\`official_posts\`" binlog1|wc
 658013 1974039 25004494
[oracle@localhost mysql]$ 这个update执行了65万次


这个update执行了65万次!


mysqlbinlog binlog.344605 | grep "GTID$(printf '\t')last_committed" -B 1 \
>                                     | grep -E '^# at' | awk '{print $3}' \
>                                     | awk 'NR==1 {tmp=$1} NR>1 {print ($1-tmp);tmp=$1}' \
>                                     | sort -n -r | head -n 10
1468183562
3802
3596
3586
3584
3520
3490
3404
3382
3380


换一种检查大事务的方法,也是1.4G!


解决办法

尝试用–binlog-row-event-max-size来解决,关于这个参数mysql的说明如下:


 --binlog-row-event-max-size=#

                     The maximum size of a row-based binary log event in

                     bytes. Rows will be grouped into events smaller than this

                     size if possible. This value must be a multiple of 256.










把这个参数设置成512M试试:

mysqlbinlog binlog.344605 -v --base64-output=decode-rows --binlog-row-event-max-size=536870912> ./binlog2


结果不行,效果和之前一样,注意这个参数说明里有“ if possible,如果可能”。

结论是这个不能用binlog滚,因为这个binlog row event超过了1G,而max_allowed_packet默认64MB,最大也只能设置1G。只能用全量恢复把这个binlog跳过去。这里可能有人问,那当时这个语句怎么产生的,一个合理的解释是,当时是用的 SQL statement,例如一个update 语句,类似 “update 新网站数据=旧网站数据 ” ,这样这个 SQL statement并不大。但binlog的格式设置为ROW,写到binlog里,每一行都要写一个update语句,总共update多少行,就有多少行update语句,这样就产生了一个巨无霸的事务。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
17天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
26天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
1月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
103 6
|
2月前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
2月前
|
Python
python读写操作excel日志
主要是读写操作,创建表格
68 2
|
2月前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
2月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
48 2
|
2月前
|
存储 SQL 关系型数据库
面试官:你能聊聊 binlog、undo log、redo log 吗?
本文详细解析了MySQL数据库中的三种日志:binlog、undo log和redo log。binlog用于记录数据库的所有表结构变更及数据修改,支持归档、主从复制和数据恢复;undo log用于事务回滚,确保事务的原子性和实现多版本控制;redo log则用于crash-safe,确保数据库异常重启后已提交记录不丢失。文章通过实例和图表,深入浅出地介绍了每种日志的特点、应用场景及其实现机制。适合数据库开发者和运维人员阅读。
181 2
|
2月前
|
小程序 IDE 开发工具
Python编程--个人信息修改小程序
Python编程--个人信息修改小程序
46 2
|
2月前
|
小程序 Linux Python
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
25 1