MySQL源码学习:ib_logfile、bin-log与主从同步

    今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭。会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行? 这会导致主从不一致。

本文简要说明下这个问题。

 

1、              写入流程

源码sql/handler.cc:

ha_commit_trans

{

  …

  if ((err= ht->prepare(ht, thd, all)))

  …

  tc_log->log_xid(thd, xid)

  …

  error=ha_commit_one_phase(thd, all)

…

}

说明:

实际上ib_logfile的两步写策略避免了上述的两个问题。流程大致如下:

a)        [ib_logfile] 写入当前事务的更新数据,并标志为事务准备(trx_prepare).

b)        写入bin-log。

c)        [ib_logfile] 当前事务提交结束(trx_commit)

 

2、              恢复流程

实际上,若ib_logfile已经写入trx_prepare,则在恢复过程中,会根据bin-log中该事务是否存在来恢复数据(见函数xarecover_handlerton)。

流程如下(sql/handler.cc)

xarecover_handlerton

{

  sql_print_information("Found %d prepared transaction(s) in %s",                             got, ha_resolve_storage_engine_name(hton));

  foreach (trx)

  {

If (found in bin-log)

{

  sql_print_information("commit xid %s", xid_to_str(buf, info->list+i));

  hton->commit_by_xid(hton, info->list+i);

}

Else

{

sql_print_information("rollback xid %s",xid_to_str(buf, info->list+i));

hton->rollback_by_xid(hton, info->list+i);

}

}

}

说明:从启动日志中能够看到上述代码输出的日志。

☆    假设在阶段a)结束之后程序异常, 此时没有写入bin-log。 则从库不会同步这个事务。 主库上,在重启之后,从恢复日志中这个事务没有trx_commit,因此会被回滚。 逻辑上主从库都不会执行这个事务。

☆    假设在阶段b)结束后程序异常,此时bin-log已经写入,则从库会同步这个事务。 主库上,根据恢复日志和bin-log,也能够正常恢复此事务。

也就是说,若bin-log写入完成,则主从库都会正常完成事务;bin-log没有写入,则主从库都回滚事务。不会出现主从不一致的问题。

 

3、              操作系统崩溃造成的不一致

上述的流程并不是天衣无缝的。ib_logfile的写盘是能够被设置成非实时flush的。假设在bin-log写入完成后,系统崩溃,则可能出现这样的情况:bin-log写入所以从库能够执行事务。但主库中trx_prepare的日志没有被写入到ib_logifle中,导致主库不执行事务。这样就会出现主从不一致的情况。

解决方案:增加启动检测,将ib_logfile中不存在的事务,从bin-log删除掉。这样主从库都不执行此事务。

CentOS 7 手动搭建生产级 LAMP 环境实战指南 LAMP(Linux + Apache + MySQL + PHP)是 Web 服务最基础、最经典的开源技术栈,其核心价值在于组件间清晰的依赖关系与高度可控的运行机制。理解 Apache 如何通过 mod_php 或 php-fpm 解析 PHP 请求、MySQL 如何为 PHP 提供持久化数据支撑、以及 SELinux/firewalld 等系统级策略如何影响服务协同,是掌握 Web 底层原理的关键起点。尤其在 CentOS 7 这类长期支持的企业级系统中,手动部署而非依赖一键脚本,能深度建立对服务生命周 阅读详情

相关推荐

Ubuntu 18.04 部署 ERPNext 的系统级协同配置指南

ERPNext 是基于 Python 和 MariaDB 构建的企业级开源 ERP 系统,其稳定运行依赖操作系统、数据库、Web 服务器与应用框架的深度协同。理解 Linux 系统服务管理(如 systemd)、关系型数据库配置(如 MariaDB 字符集与事务隔离)、反向代理原理(Nginx 缓存与超时机制)及 Python 虚拟环境隔离机制,是保障多模块数据一致性和高并发业务连续性的技术基础。本文聚焦 Ubuntu 18.04 这一经典 LTS 环境,详解 ERPNext 生产部署中必须调优的五大核心维

weixin_30363509的博客 312

mysql 主从同步

mysql主从搭建 目录 mysql主从搭建 1.1)打开主库二进制文件 开启二进制文件,主库的二进制文件默认是关闭的,需要手动打开 主机126.129 从机129.130 1.2)找到主机的/ect/my.cnf , 使用vim打开该文件 添加两个元素 ...

weixin_46170854的博客 427

C#串口通讯实战:如何用SerialPort类搞定工业传感器数据采集(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现工业级传感器数据采集,涵盖串口通讯基础配置、数据帧处理、异常恢复机制及性能优化策略。通过实战代码示例,帮助开发者构建稳定可靠的工业数据采集系统,特别适合需要处理高频数据采集和复杂工业环境的场景。

weixin_42525551的博客 1088

mysql innodb ib_logfile、bin-log与主从同步的问题

今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭。会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行? 这会导致主从不一致。 本文简要说明下这个问题。   1、              写入

lidan3959的专栏 1280

四自由度SCARA机器人的运动学和动力学MATLAB建模与仿真

本文介绍了四自由度SCARA机器人的运动学和动力学建模,使用MATLAB进行了相应的建模与仿真。通过正运动学和动力学分析,可以了解机器人在不同状态下的运动特性和力学特性。这为后续的控制算法设计和性能优化打下了基础。希望本教程对学习SCARA机器人有帮助。

小蜗牛的珍贵百宝箱 3640

【系统架构设计师】十、统一建模语言UML(基本概念|UML2.0|SysML)

UML 2.0 提供了 14 种图,分别是类图、对象图、用例图、序列图、通信图(协作图)、状态图、活动图、构件图(组件图)、部署图、制品图、组合结构图、包图、交互概览图和计时图(定时图)。序列图、通信图、交互概览图和计时图均被称为交互图。 系统建模语言(SysML)是一种通用图形建模语言,用于指定,分析,设计和验证可能包括硬件,软件,信息,人员,程序和设施的复杂系统。特别是,该语言提供了图形表示,其具有用于建模系统需求,行为,结构和参数的语义基础,用于与其他工程分析模型集成。

帅次的博客 2523

ib_logfile与log-bin区别

哪位大侠能说一下这两个区别,我只知道两个都是记录日志的。 就是ib_logfile0与mysql-bin.000011区别 哪位大侠能说一下这两个区别,我只知道两个都是记录日志的。 就是ib_logfile0与mysql-bin.000011区别  参考方案 ib_logfile0 记录系统的回滚,重做日志。 mysql-bin.000011 系统的所有更新记录。 如果

linuxheik的专栏 1万+

2026年数学建模国赛C题利器:层次分析法与主成分分析在统计建模中的应用

本文系统探讨了层次分析法(AHP)与主成分分析(PCA)在数学建模竞赛,特别是全国大学生数学建模竞赛C题中的联合应用策略。通过理论阐述、方法对比和案例实践,本文揭示了两种方法从“数据降维”到“决策评价”的完整分析链条,提出了“PCA+AHP”协同框架,并通过实际算例验证了该框架在解决复杂评价类问题中的有效性和优越性。研究表明,将PCA的客观降维能力与AHP的主观决策优势有机结合,能够显著提升统计建模的科学性、合理性和解释力,是应对日益复杂的竞赛题目的重要方法论工具。关键词:层次分析法;主成分分析;数学建模。

YOLO 41

ib_logfile和mysql_bin_MySQL源码学习:ib_logfile、bin-log与主从同步

今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭。会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行?这会导致主从不一致。本文简要说明下这个问题。1、写入流程源码sql/handler.cc:ha...

weixin_42298279的博客 382

核心组件大换血:Backbone与Neck魔改篇:YOLO26魔改Neck:引入BiFPN(双向特征金字塔),多尺度融合能力飙升

本文深入解析了YOLO26目标检测模型中Neck部分的优化策略,重点探讨了BiFPN(双向特征金字塔网络)的原理与实现。文章首先指出YOLO26原生FPN+PAN结构在多尺度特征融合上的局限性,特别是在小目标检测和边缘部署场景中的性能瓶颈。随后系统梳理了Neck网络的演进历程,从FPN、PANet到BiFPN和ASFF,详细对比了各架构的特点。核心部分展示了如何将BiFPN引入YOLO26,包括可学习权重融合、双向跨尺度连接等关键技术实现,并提供了PyTorch代码示例。本文为需要提升小目标检测性能或优化边

ZDQ58818的博客 247

12-RK平台U-Boot启动流程

先看概述,把这一章要回答的问题摆出来,带着问题听。RK 特有的 BootROM -> MiniLoader -> SPL -> U-Boot -> Kernel。这是因为 RK 平台使用闭源的 DDR 初始化固件,需要通过 MiniLoader 来加载和运行。为什么多一层?这是 RK 平台的特殊性决定的。RK 平台使用闭源的 DDR 初始化固件,这段代码 Rockchip 不开源,只能以二进制形式提供,它需要一个载体来加载和运行,这个载体就是 MiniLoader。

内核笔记 1149

MySQL源码学习:InnoDB的ib_logfile写入策略

ib_logfile是InnoDB的事务日志文件。本文简要说明其写入时机、写入策略及如何保证数据安全。     1、              基本概念 a)        ib_logfile文件个数由innodb_log_files_in_group配置决定,若为2,则在datadir目录下有两个文件,命令从0开始,分别为ib_logfile0和ib_logfile. b)   ...

追风刀·丁奇 224

DBeaver配置本地mysql-connector驱动文件

本文摘要:介绍了数据库驱动管理的基本操作步骤:1)新建驱动管理器,填写MySQL驱动名称、类名和类型;2)添加本地MySQL驱动文件;3)创建数据库连接并测试。适用于MySQL5.x和8.x版本,帮助用户快速配置数据库连接。

litlit023的专栏 1697

MySQL 5.5 在CentOS 7的完整部署、配置与运维实战指南

数据库作为信息系统的核心组件,其稳定运行依赖于合理的部署、配置与运维。以MySQL为代表的关系型数据库,通过其存储引擎、查询优化器等核心机制,管理着结构化数据,支撑着从Web应用到企业核心系统的各类业务。理解数据库的安装部署、参数调优与日常维护,对于保障数据安全与系统性能至关重要。尤其在处理历史遗留系统或特定稳定版本需求时,掌握特定版本如MySQL 5.5的部署技能,成为一项关键的工程实践能力。本文聚焦于在CentOS 7环境下,从零开始完成MySQL 5.5的安装,并深入解析其核心配置参数如innodb_

weixin_34025151的博客 492

[毕设项目-大模型微调]现代文翻译文言文【基于LLaMA3.1-8B微调】

教你基于LLaMA3.1-8B微调如何做到现代文翻译文言文

逐梦苍穹的博客 2297

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

知识体系之MySQL

mysql

JaweG 5251

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

mac系统中Java项目环境配置与问题解决全记录| 项目构建篇:Maven编译与打包

在上一篇中,我们已经成功配置了JDK 17和Maven 3.9.8,并成功编译打包了项目。然而,当你满怀期待地执行你的应用需要连接MySQL数据库,但MySQL服务没有运行或根本没有安装。本文将极其详细安装MySQL 8.0(两种方式:压缩包手动安装 + DMG图形化安装)初始化MySQL数据目录并设置root密码创建项目数据库并导入初始化SQL脚本安装Redis并配置为服务最终成功启动Spring Boot应用。

肥晨开发的学习之路 445

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Ubuntu 14.04 LAMP环境搭建:Linux+Apache+MySQL+PHP实战指南

LAMP 是 Linux、Apache、MySQL 和 PHP 四个开源组件构成的经典 Web 开发栈,代表了动态网站最基础且稳定的运行范式。其核心原理在于操作系统层(Linux)提供进程与权限管理,Web 服务器(Apache)处理 HTTP 协议并转发请求,脚本引擎(PHP)执行服务端逻辑,数据库(MySQL)持久化结构化数据——四者通过标准接口(如 CGI、SAPI、MySQLi 扩展)紧密协同。这种分层架构具备高可维护性、强社区支持和成熟安全实践,广泛应用于教学实验、遗留系统迁移及轻量级生产环境。尤

weixin_30443731的博客 400

MySQL彻底卸载指南:Windows与Linux平台完整清理流程与避坑技巧

在数据库管理与运维中,软件残留是导致新版本部署失败、服务冲突的常见根源。其原理在于数据库系统作为核心服务组件,会在操作系统中写入程序文件、注册服务、存储数据与配置等多层次痕迹。彻底清理的技术价值在于确保系统环境纯净,避免因残留文件、注册表项或服务注册导致端口占用、初始化失败等兼容性问题。这一实践对于数据库版本升级、环境迁移、故障排查等应用场景至关重要。本文聚焦于MySQL数据库的深度卸载,详细解析了在Windows与Linux平台下,如何通过系统化操作移除所有相关文件、服务、注册表及环境变量,并提供了基于m

weixin_30520015的博客 334

CentOS 7下MySQL 5.7安装配置全攻略:从YUM安装到性能优化

关系型数据库作为数据持久化的核心组件,其安装与配置是系统部署的基础环节。MySQL作为最流行的开源关系数据库之一,通过YUM包管理器安装能够自动解决依赖问题并实现标准化服务管理。在CentOS 7这样的经典Linux发行版上部署MySQL 5.7版本,需要掌握仓库配置、安全初始化、防火墙设置等关键技术环节。从工程实践角度,合理的性能参数调优(如InnoDB缓冲池配置)和远程访问授权能显著提升数据库的稳定性和可用性。本文以MySQL 5.7在CentOS 7的部署为例,详细解析了包括**systemctl服务

weixin_30399155的博客 483

《Java 100 天进阶之路》第89篇:MySQL面试压轴题(2026版)

摘要:覆盖存储引擎、事务MVCC、锁机制、SQL优化与工具链、高可用架构、分库分表等 45+ 道高频面试题。深度剖析 InnoDB vs MyISAM、MVCC 原理、死锁排查、深分页优化,并新增 AI 辅助慢 SQL 诊断、Optimizer Trace / 直方图调优、云原生 Serverless 数据库选型 等 2026 前沿视角。每个考点配套标准话术 + 加分回答 + 实战经验。面试突击,这一篇就够了。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 4880

mysql中ib_logifle和binlog的区别

ib_logfile包含修改innodb表的语句。如果数据库读写失败,它会回滚到innodb数据库失败之前未完成的事务以保证数据库数据的一致性。无论是哪种引擎binlog都记录所有数据库修改操作。如果你要做还原,可以会滚到指定的时间点查看自那个时间但开始哪些语句运行了。 ib_logfile是临时的,当在表空间中修改了数据之后,它就会被重写(它写日志的算法的循环覆盖旧的)。而binlog会

Jasmine的网络笔记 1179
上一篇: MySQL源码学习:InnoDB的ib_logfile写入策略
下一篇: MySQL源码学习:简述InnoDB的BP LRU策略
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值