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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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日志并进行多维度分析。
相关文章
|
1月前
|
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的哪个特性?
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1630 14
|
25天前
|
Python
python读写操作excel日志
主要是读写操作,创建表格
51 2
|
24天前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
1月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
35 2
|
1月前
|
存储 SQL 关系型数据库
面试官:你能聊聊 binlog、undo log、redo log 吗?
本文详细解析了MySQL数据库中的三种日志:binlog、undo log和redo log。binlog用于记录数据库的所有表结构变更及数据修改,支持归档、主从复制和数据恢复;undo log用于事务回滚,确保事务的原子性和实现多版本控制;redo log则用于crash-safe,确保数据库异常重启后已提交记录不丢失。文章通过实例和图表,深入浅出地介绍了每种日志的特点、应用场景及其实现机制。适合数据库开发者和运维人员阅读。
78 2
|
1月前
|
小程序 IDE 开发工具
Python编程--个人信息修改小程序
Python编程--个人信息修改小程序
|
1月前
|
小程序 Linux Python
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
|
26天前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
53 0
|
2月前
|
人工智能 小程序 API
文字转语音神器+Python编程搞定语音报时小程序
文字转语音神器+Python编程搞定语音报时小程序