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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 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语句,这样就产生了一个巨无霸的事务。


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
19天前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
54 6
|
5月前
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
213 23
|
6月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
168 23
|
8月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
640 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
6月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
7月前
|
API 开发工具 Python
|
9月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
360 7
MySQL事务日志-Undo Log工作原理分析
|
7月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
856 0
|
12月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
2204 14
MySQL事务日志-Redo Log工作原理分析
|
10月前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。

热门文章

最新文章

推荐镜像

更多