当前位置: 首页 > article >正文

MySQL调优实战:MySQL日志机制深入解析,redo/undo/binlog/slow/error日志底层全通透

一、MySQL五大日志总览全局认知MySQL 日志严格分为两层Server层日志 InnoDB引擎层日志。这是90%人混淆的根源1.1 Server层日志所有引擎通用Binlog二进制日志主从复制、数据恢复、逻辑日志Slow Query Log慢查询日志SQL性能优化Error Log错误日志启动、崩溃、异常排查1.2 InnoDB引擎层日志仅InnoDB独有Undo Log回滚日志事务回滚 MVCC多版本Redo Log重做日志崩溃恢复 事务持久性总结Binlog管逻辑、Redo管物理Undo管版本与回滚Slow管性能Error管异常。二、Undo Log 回滚日志MVCC核心2.1 核心作用必背Undo Log 只有两个作用事务回滚保证事务原子性MVCC多版本快照保存历史数据版本实现无锁读2.2 存储内容记录修改前的旧数据。每次 update/delete 不会覆盖数据而是把旧数据存入 undo log通过行隐藏字段DB_ROLL_PTR串联成版本链。2.3 管理方式InnoDB对undo log文件的管理采用段的方式也就是回滚段rollback segment 。每个回滚段记录了 1024 个 undo log segment 每个事务只会使用一个undo log segment。在MySQL5.5的时候只有一个回滚段那么最大同时支持的事务数量为1024个。在MySQL 5.6开始InnoDB支持 最大 128个回滚段故其支持同时在线的事务限制提高到了 128*10242.4 常用参数2.5 生命周期事务执行生成 undo log事务回滚用 undo 恢复数据事务提交undo不会立刻删除,针对新增的记录,在事务提交后就可以删除等待没有事务引用该版本后后台线程 purge 清理2.6 生产致命坑点长事务 undo 版本链无法清理 磁盘暴涨 查询变慢长事务不提交会导致大量 undo 堆积MVCC 构造数据可视图时需要回溯超长版本链SQL 越来越慢。三、Redo Log 重做日志崩溃恢复核心3.1 诞生目的解决磁盘随机写太慢的问题。MySQL 修改数据先改内存不会立刻刷磁盘依靠 redo log 保证宕机不丢数据。3.2 核心特性物理日志记录「数据页第几偏移量、改成了什么」环形循环写入ib_logfile0、ib_logfile1 循环覆盖只属于InnoDB保证事务持久性3.3 写入流程核心WAL机制先写日志后写数据修改 Buffer Pool 内存数据写入 Log Buffer按策略刷盘到 redo log 文件后台线程空闲时刷盘真实数据页3.4 崩溃恢复原理重启 MySQL 时,扫描 redo 日志区分事务状态已提交事务redo 重做把没刷盘的数据补上未提交事务,未有prepare标志位直接丢弃保证数据一致性未提交事务,有prepare标志位,且无binlog日志:直接丢弃保证数据一致性未提交事务,有prepare标志位,且有binlog日志:redo 重做把没刷盘的数据补上3.5 核心参数innodb_flush_log_at_trx_commit1默认、最安全每次提交必刷盘金融、支付必须用2写系统缓存、定时落盘性能折中0每秒刷盘性能最高、断电丢数据3.6 关键参数innodb_log_buffer_size设置redo log buffer大小参数默认16M 最大值是4096M最小值为1M。innodb_log_group_home_dir设置redo log文件存储位置参数默认值为./即innodb数据文件存储位置其中的 ib_logfile0 和 ib_logfile1 即为redo log文件。innodb_log_files_in_group设置redo log文件的个数命名方式如: ib_logfile0, iblogfile1... iblogfileN。默认2个最大100个。innodb_log_file_size设置单个redo log文件大小默认值为48M。最大值为512G注意最大值指的是整个 redo log系列文件之和即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值512G。3.7redo log 写入磁盘过程分析redo log 从头开始写写完一个文件继续写另一个文件写到最后一个文件末尾就又回到第一个文件开头循环写如下面这个图所示。write pos是当前记录的位置一边写一边后移写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint是当前要擦除的位置也是往后推移并且循环的擦除记录前要把记录更新到数据文件里。write pos 和 checkpoint 之间的部分就是空着的可写部分可以用来记录新的操作。如果 write pos 追上checkpoint表示redo log写满了这时候不能再执行新的更新得停下来先擦掉一些记录把 checkpoint 推进一下。3.8redo log写入策略参看下图四、Binlog 二进制日志主从恢复核心4.1 基本定位Server层逻辑日志所有存储引擎通用。binlog二进制日志记录保存了所有执行过的修改操作语句不保存查询操作不是物理页修改。MySQL5.7 版本中binlog默认是关闭的8.0版本默认是打开的。上图中log_bin的值是OFF就代表binlog是关闭状态打开binlog功能需要修改配置文件my.ini(windows)或my.cnf(linux)然后重启数据库。 在配置文件中的[mysqld]部分增加如下配置4.2 两大核心作用主从复制从库拉取 binlog 回放同步数据数据恢复误删数据可通过 binlog 时间点恢复4.3 Binlog三种格式Statement记录SQL语句节省空间但是对于一些执行过程中才能确定结果的函数比如UUID()、 SYSDATE()等函数如果随sql同步到slave机器去执行可能主从数据不一致Row生产推荐记录行变更精准、无误差、数据安全Mixed混合模式自动适配在Mixed模式下MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式也就是在Statement和Row之间选择一种如果sql里有函数或一些在执行时才知道结果的情况会选择Row其它情况选择Statement推荐使用这一种。4.4 Binlog写入磁盘机制Binlog写入磁盘机制主要通过 sync_binlog 参数控制默认值是 0。为0的时候表示每次提交事务都只 write 到page cache由系统自行判断什么时候执行 fsync 写入磁盘。虽然性能得到提升但是机器宕机page cache里面的 binlog 会丢失。也可以设置为1表示每次提交事务都会执行 fsync 写入磁盘这种方式最安全。还有一种折中方式可以设置为N(N1)表示每次提交事务都write 到page cache但累积N个事务后才 fsync 写入磁盘这种如果机器宕机会丢失N个事务的binlog。发生以下任何事件时, binlog日志文件会重新生成服务器启动或重新启动服务器刷新日志执行命令flush logs日志文件大小达到 max_binlog_size 值默认值为 1GB4.5 删除Binlog日志文件4.6 查看Binlog日志文件4.7 Binlog数据恢复实操前提是binlogON 且 binlog_formatROW如果不是 ROW 模式只能恢复库 / 表级无法精准恢复行数据。少量数据删除恢复定位误删的 binlog 区间时间 / 位置mysqlbinlog --base64-outputdecode-rows -v --start-datetime2026-05-22 10:00:00 --stop-datetime2026-05-22 10:10:00 /var/lib/mysql/mysql-bin.000123 delete_log.sql我们先查看binlog日志文件--base64-outputdecode-rows -v把行级事件翻译成可读伪 SQL能看到被删行的完整数据。打开delete_log.sql查询对应的删除语句,找到事务的起止位置把delete语句反写成insert语句,在数据库执行如果是批量数据误删或者是删表删库则需要通过最新的全量备份备份时间点到当前的binlog来恢复数据,执行如下sql执行过程需要过滤掉误删除的sql,按时间段来执行binlog日志,具体的查询语句的时间节点上述已经描述,这就不错过多冗余介绍4.8 Redo Log vs Binlog 面试终极区别维度Redo LogBinlog层级InnoDB引擎层Server服务层类型物理日志页变更逻辑日志SQL/行变更作用崩溃恢复、持久化复制、备份、恢复引擎仅InnoDB所有引擎通用写入方式环形循环覆盖追加写入永不覆盖4.9 为什么会有redo log和binlog两份日志呢因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM但是MyISAM 没有 crash-safe 的能力binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的既然只依靠 binlog 是没有crash-safe 能力的所以InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。有了 redo logInnoDB 就可以保证即使数据库发生异常重启之前提交的记录都不会丢失这个能力称为crash safe。4.10 两阶段提交2PC核心原理为了保证 redo log 和 binlog数据一致InnoDB 使用 2PCPrepare阶段写 redo log状态prepare、写 binlogCommit阶段redo log 打上 commit 标记宕机恢复判断有 prepare 无 commit判断 binlog 是否完整binlog 完整则提交不完整则回滚保证主从数据绝对一致五、Slow Query Log 慢查询日志性能优化核心5.1 作用记录执行时间超过阈值的SQL是慢SQL优化、排查数据库卡顿的核心依据。5.2 核心参数slow_query_logON开启慢日志long_query_time1超过1秒即为慢SQLlog_queries_not_using_indexes记录未走索引SQL5.3 生产价值线上数据库 CPU 高、IO 高、接口超时90%都能从慢日志找到根源。六、Error Log 错误日志故障排查核心6.1 记录内容MySQL启动、关闭、重启信息崩溃宕机原因参数错误、权限错误、文件损坏连接异常、引擎报错数据库莫名其妙挂掉、启动失败优先看 error log七、通用查询日志通用查询日志记录用户的所有操作包括启动和关闭MySQL服务、所有用户的连接开始时间和截止时间、发给MySQL 数据库服务器的所有 SQL 指令等如select、show等无论SQL的语法正确还是错误、也无论SQL执行成功还是失败MySQL都会将其记录下来。通用查询日志用来还原操作时的具体场景可以帮助我们准确定位一些疑难问题比如重复支付等问题。general_log是否开启日志参数默认为OFF处于关闭状态因为开启会消耗系统资源并且占用磁盘空间。一般不建议开启只在需要调试查询问题时开启。八、五大日志联动全局总结终极闭环一条更新SQL完整日志流程执行更新先写入undo log用于回滚、MVCC修改内存数据写入redo log prepare写入binlogredo log 标记 commit后台刷盘数据页SQL过慢则记录slow log出现崩溃则记录error log九、面试极简总结背诵版MySQL 包含五大日志undo log 实现事务回滚与MVCC多版本redo log 基于WAL机制实现崩溃恢复保障事务持久性binlog 是Server层逻辑日志支撑主从复制与数据恢复通过两阶段提交保证与redo log一致slow log 用于慢SQL性能排查error log 用于故障定位。其中 redo/undo 为InnoDB独有binlog/slow/error 为全局通用日志。十、全文终极口诀Undo回滚存版本MVCC靠它撑场Redo重做防宕机WAL机制保高强Binlog复制做恢复逻辑日志主从帮Slow查慢优性能Error排错救故障两层日志分清楚底层通透不慌张。

相关文章:

MySQL调优实战:MySQL日志机制深入解析,redo/undo/binlog/slow/error日志底层全通透

一、MySQL五大日志总览(全局认知)MySQL 日志严格分为两层:Server层日志 InnoDB引擎层日志。这是90%人混淆的根源:1.1 Server层日志(所有引擎通用)Binlog(二进制日志):主…...

AirPodsDesktop:在Windows上解锁苹果耳机的完整体验

AirPodsDesktop:在Windows上解锁苹果耳机的完整体验 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop 你是否曾经在W…...

Meta 裁员约 8000 人:弥补 AI 巨额投资,削减人力成本

Meta 裁员:弥补 AI 投资缺口据报道,Meta 已通知数千名员工被裁员,此次裁员是为弥补其在人工智能方面的巨额投资。《商业内幕》分享的 Meta 管理层邮件显示,这是公司“持续努力提高运营效率、平衡其他投资的举措之一”。裁员规模与…...

MinerU实战训练营教程及配套素材

目前实战训练营的所有课程视频和文档都已经更新,如需要学习可访问飞书文档进行查看:https://aicarrier.feishu.cn/wiki/Bv0GwrC26iCp5LkqBjHcM8mjnOe • 相关课程材料也已经上传GitHub repo:https://github.com/opendatalab/mineru-tutorial…...

Spotify推AI应用Studio,结合多信息源生成简报、播客和歌单!能“代你行动”

Spotify Studio:AI驱动的内容生成新利器Spotify Labs推出的全新独立AI应用程序Studio,可根据聊天机器人提示,在用户电脑上生成每日简报、播客和歌单。其生成内容会参考用户在Spotify上的收听历史,以及连接到该应用的其他应用信息&…...

避开BLE开发第一个坑:搞懂广播帧里的TxAdd、ChSel字段,让你的智能硬件不再‘隐身’

避开BLE开发第一个坑:广播帧关键字段解析与实战排查指南 当你第一次将精心编写的固件烧录进蓝牙芯片,满心期待地用手机扫描设备时,却发现屏幕上空空如也——这种"设备隐身"的挫败感,几乎每个BLE开发者都经历过。问题的根…...

从Polar靶场“中等”难度题,聊聊新手CTFer最容易踩的5个Web安全坑

从Polar靶场“中等”难度题,聊聊新手CTFer最容易踩的5个Web安全坑 当你第一次踏入CTF的Web安全领域,Polar靶场的中等难度题目就像一座看似平缓却暗藏陷阱的山峰。许多新手在这里反复跌倒,不是因为技术门槛过高,而是忽略了那些本该…...

别再只会用默认库了!用OrCAD Capture CIS高效创建Homogeneous与Heterogeneous复合器件

高效设计复杂芯片:OrCAD Capture CIS中Homogeneous与Heterogeneous器件的进阶实践 在电子设计领域,面对日益复杂的芯片架构,工程师们常常陷入一个两难境地:当芯片包含多个功能单元时,是应该逐个绘制每个部分&#xff…...

不止于Windows:用QtService源码打造跨平台(Windows/Linux)守护进程的实践指南

不止于Windows:用QtService源码打造跨平台守护进程的实践指南 在当今多平台开发环境中,Qt框架因其卓越的跨平台能力而备受青睐。但当我们从GUI应用转向后台服务开发时,许多开发者会发现一个尴尬的现实:Windows服务与Linux守护进程…...

手把手教你用Mosquitto + PowerShell玩转MQTT消息订阅与发布(实战测试篇)

手把手教你用Mosquitto PowerShell玩转MQTT消息订阅与发布(实战测试篇) MQTT协议作为物联网领域的核心通信标准,其轻量级和发布/订阅模式为设备互联提供了高效解决方案。本文将带您通过Windows PowerShell与Mosquitto搭建完整的MQTT测试环境…...

2026 年一人公司创业热潮:政策与 AI 驱动,机遇背后暗藏风险

一人公司创业热潮来袭:政策与 AI 双驱动,机遇背后暗藏风险从苏州到深圳,从成都到上海,一种名为 OPC(One Person Company,一人公司)的创业范式正以前所未有的速度席卷全国。数据为证:…...

C++ Kafka实战:用librdkafka手写一个带自定义分区和事件回调的生产者

C Kafka实战:构建高性能生产者客户端的深度实践 在分布式系统架构中,消息队列作为解耦生产者和消费者的关键组件,其重要性不言而喻。而Apache Kafka凭借其高吞吐、低延迟和水平扩展能力,已成为现代实时数据管道和流处理应用的首选…...

别再只用Graphics2D了!5个Java图片缩放方案实战评测:从Thumbnailator到OpenCV,谁画质最好?

别再只用Graphics2D了!5个Java图片缩放方案实战评测:从Thumbnailator到OpenCV,谁画质最好? 当你在Java项目中需要处理用户上传的图片时,是否也遇到过这样的困扰:用Graphics2D简单缩放后,图片变得…...

我踩了N多劣质工具坑从嫌弃到真香,2026这款语音生成软件真后悔没早用

上周刚下班被leader留下来整理2小时项目评审会纪要,对着录音逐句暂停记,熬到八点半还错漏了三个核心需求;上个月做行业专家访谈,3小时录音来回听,耳朵疼得发胀还漏了嘉宾的核心观点;报了线上的产品进阶课&a…...

美股软件股反弹:AI 重塑软件未来,谁能成为时代赢家?

美股软件股遭遇“集体误杀”去年 10 月底开始,美股软件股经历罕见“集体误杀”。以软件 ETF——IGV 为代表,软件板块从高位显著回撤,跌幅接近 40%。曾经的高质量成长资产软件公司,沦为 AI 浪潮下的“旧世界遗产”。恐慌源于 DeepS…...

锂电池健康评估:避开NASA/Oxford数据IC分析中的三个常见坑(滤波、异常值、容量增生)

锂电池健康评估实战:破解NASA/Oxford数据集IC分析的三重困局 当你在深夜盯着屏幕上那些扭曲的IC曲线时,是否也经历过这样的崩溃时刻?明明按照教科书步骤处理NASA数据集,得到的却是锯齿状的噪声图形;或是发现Oxford数据…...

从分子设计到社交网络:聊聊DiGress在图生成领域的实战潜力与当前局限

从分子设计到社交网络:DiGress在图生成领域的实战潜力与当前局限 当药物研发团队需要快速生成数百万种候选分子结构,或是社交平台试图模拟用户关系网络时,图生成技术正悄然改变这些行业的创新范式。在众多前沿方法中,DiGress&…...

AI时代什么建站软件功能强大?从GEO流量重构看CMS的智慧进化

2026年,互联网的底层逻辑正在发生一场“静默革命”。如果你的思维还停留在“建一个网站只是为了有个官网给客户看”,那么你可能正在被时代抛弃。当下的AI已经不仅仅是一个聊天工具,它正在重构整个信息的传播秩序。传统的SEO(搜索引…...

手把手教你配置海康NVR的GB28181国标编号,彻底告别‘通道数0’问题

海康NVR国标编号配置实战:从通道数为0到完美接入GB28181 第一次接触GB28181协议对接时,最让人抓狂的莫过于明明按照文档一步步配置,却在平台端看到冰冷的"通道数:0"。上周我就遇到了这个情况——客户新部署的海康NVR死活…...

WordPress与PageAdmin CMS深度技术对比:从架构到国产化合规的全维度分析

摘要在内容管理系统选型中,WordPress作为全球市场占有率最高的开源CMS,与国内企业级平台PageAdmin CMS代表了两种不同的技术路线。本文从底层架构(PHP vs .NET Core)、数据库设计、缓存策略、安全机制、二次开发能力、国产化适配及…...

保姆级教程:SAP资产折旧调错了怎么办?手把手教你用AB08和反向事务类型回退操作

SAP资产折旧纠错实战:AB08与反向事务类型的精准回退方案 资产折旧调整是SAP系统中高频操作之一,但误操作后的修正往往让使用者手足无措。当ABAA或ABMA执行后发现金额错误时,如何安全撤回操作而不影响历史数据?本文将深入解析两种主…...

国产多模态大模型 vs DALL-E:本土化突围与全球竞技

国产多模态大模型 vs DALL-E:本土化突围与全球竞技 引言 在AIGC浪潮席卷全球的当下,OpenAI的DALL-E系列无疑是图像生成领域的耀眼明星,其惊人的创造力和对自然语言的深刻理解,定义了“文生图”的新高度。然而,当我们聚…...

Houdini 19.5 新手必看:从自定义启动界面到项目设置的保姆级避坑指南

Houdini 19.5 新手必看:从自定义启动界面到项目设置的保姆级避坑指南 第一次打开Houdini 19.5时,面对密密麻麻的界面和复杂的参数设置,很多新手会感到无所适从。本文将带你系统性地完成从界面个性化到项目配置的全流程,避开那些容…...

量子加速,多模态跃迁:国产大模型的下一站机遇

量子加速,多模态跃迁:国产大模型的下一站机遇 引言 当国产多模态大模型在理解图文、生成内容上不断突破时,一个更具颠覆性的技术变量正在悄然融入——量子计算。这不仅是实验室里的前沿概念,更是百度、华为、阿里等科技巨头竞相布…...

树莓派Zero 2W + 0.96寸OLED屏保姆级接线与配置教程(附I2C开启与Python库安装)

树莓派Zero 2W与0.96寸OLED屏从接线到显示的完整实战指南 第一次拿到树莓派Zero 2W和0.96寸OLED屏时,那种既兴奋又忐忑的心情我至今记得——这么小的板子真能驱动屏幕吗?接线会不会烧毁设备?经过多次实践和踩坑,我整理出这份真正适…...

别再只会用PWM调速度了!STM32驱动直流有刷电机,H桥的三种模式(单极/双极/受限)到底怎么选?

STM32驱动直流有刷电机的三种H桥模式深度解析与实战选型指南 在嵌入式电机控制领域,PWM调速早已成为基础技能,但真正决定系统性能的往往是H桥工作模式的选择。当你的电机出现异常发热、刹车响应迟缓或低速抖动时,问题很可能就出在模式选择不当…...

Klogg实战:5分钟搞定海量日志中的Error排查(颜色标记+正则过滤技巧)

Klogg实战:5分钟搞定海量日志中的Error排查(颜色标记正则过滤技巧) 日志分析是每个开发者、测试和运维人员日常工作中不可或缺的一部分。面对动辄几个GB的日志文件,如何快速定位到关键的error信息,往往决定了问题解决的…...

Stata面板数据回归保姆级教程:从xtset到豪斯曼检验,手把手搞定实证分析

Stata面板数据回归实战指南:从数据准备到模型选择的完整解析 面板数据分析在经济学、管理学等社科领域占据着核心地位,但许多初学者在面对Stata操作时常常感到无从下手。本文将从一个完整的实证分析流程出发,不仅介绍基础命令,更着…...

避坑指南:MMSegmentation自定义数据集训练时,如何解决‘xxxDataset is not in the dataset registry’等5个常见报错

MMSegmentation实战避坑:5大训练报错精准解决方案 引言 当你第一次尝试用MMSegmentation训练自定义数据集时,是否遇到过这样的场景:按照教程一步步操作,却在运行train.py时突然遭遇红色报错信息?作为计算机视觉领域最流…...

VLC隐藏玩法:结合Lua脚本实现智能视频播放(比如根据时间切换片单)

VLC隐藏玩法:结合Lua脚本实现智能视频播放 你是否厌倦了手动切换播放列表?VLC作为一款开源多媒体播放器,其真正的潜力远不止于基础播放功能。通过Lua脚本接口,我们可以解锁VLC的自动化能力,实现根据时间、文件存在与否…...