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

简介: 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语句,这样就产生了一个巨无霸的事务。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
1043 0
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
424 6
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
1123 23
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
472 22
|
API 开发工具 Python
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
509 16
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
337 4
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
2205 0

推荐镜像

更多