MySQL日志的一些疑惑解答

news2024/11/26 0:56:13

1.两阶段提交,要是在binlog写入磁盘后,redolog还没处于commit状态,这时事务会回滚吗?

我们先来看一下崩溃恢复时的判断规则。 

  1. 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;
  2. 如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整: a. 如果是,则提交事务; b. 否则,回滚事务。

时刻1:写入binlog时发生异常。MySQL根据redo log日志恢复数据,发现redo log还处于prepare阶段,并且没有对应binlog日志,这就是对应情况2(b),就会回滚该事务。

时刻2:redo log和binlog都写入成功,只是redolog还是处于prepare。这时并不会回滚事务,虽然redo log是处于prepare阶段,但是能通过redolog的数据找到对应的binlog日志,这就是对应q情况2(a),MySQL认为对应的事务binlog是完整的,就会提交事务恢复数据。

可以看到,对于处于 prepare 阶段的 redo log,可以提交事务,也可以回滚事务,这取决于是否查找到与与该redo log对应的完整binlog。如果有就提交事务,如果没有就回滚事务。这样就可以保证 redo log 和 binlog 这两份日志的一致性了。

所以说,两阶段提交是以 binlog 写成功为事务提交成功的标识。

2.redo log和binlog是如何关联起来的

它们有一个共同的数据字段,叫 XID。崩溃恢复的时候,会按顺序扫描 redo log:

  • 如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;
  • 如果碰到只有 parepare、而没有 commit 的 redo log,就拿着 XID 去 binlog 找对应的事务。

3.怎样才是完整的binlog

只找到对应的XID还不行,还需要判断该binlog是否完整的。

一个事务的 binlog 是有完整格式的:

  • statement 格式,最后会有 COMMIT
  • row 格式,最后会有一个 XID event

另外,在 MySQL 5.6.2 版本以后,还引入了 binlog-checksum 参数,用来验证 binlog 内容的正确性。对于 binlog 日志由于磁盘原因,可能会在日志中间出错的情况,MySQL 可以通过校验 checksum 的结果来发现。所以,MySQL 还是有办法验证事务 binlog 的完整性的。

4.为什么 redo log 具有 crash-safe 的能力,而 binlog 没有?

redo log 和 binlog 有一个很大的区别就是,一个是循环写,一个是追加写。也就是说 redo log 只会记录未刷盘的日志,已经刷入磁盘的数据都会从 redo log 这个有限大小的日志文件里删除。binlog 是追加日志,保存的是全量的日志。

重启后,只通过 binlog 数据库没有标志无法判断有哪些记录还没写入磁盘,只能全盘恢复,那就会出问题。

但 redo log 不一样,只要刷入磁盘的数据,都会从 redo log 中抹掉,数据库重启后,直接把 redo log 中的数据都恢复至内存就可以了。这就是为什么 redo log 具有 crash-safe 的能力,而 binlog 不具备。

5.redo log的WAL 之后如果读数据,是不是一定要读盘,是不是一定要从 redo log 里面把数据更新以后才可以返回?

这个其实是不一定的。写了redolog后,会更新内存中的数据,要是这时进行查询,而数据还在内存中,就直接访问内存即可,不需要去读取磁盘,也不需要把redo log里的数据更新到数据磁盘中。

6.MySQL是如何判断是否是脏页?

这里需要用到LSN的知识。LSN (log sequence number)是日志的逻辑序列号,在InnoDB存储引擎中,LSN的值会随着日志的写入而逐渐增大。新的日志LSN等于旧的LSN加上新增日志的大小。

内存数据页中有LSN,redo log日志文件中checkpoint也有LSN。对比这个LSN跟checkpoint 的LSN,比checkpoint小的一定是干净页,即是大于checkpoint的LSN的内存数据页就是脏页

7.MySQL基于Checkpoint如何从crash中恢复?

使用show语句

show engine innodb status\G;

---省略部分内容
---
LOG
---
Log sequence number          21926177
Log buffer assigned up to    21926177
Log buffer completed up to   21926177
Log written up to            21926177
Log flushed up to            21926177
Added dirty pages up to      21926177
Pages flushed up to          21926177
Last checkpoint at           21926177

可以看到多种LSN,主要是查看以下4种:

  • log sequence number: 代表当前的重做日志redo log(in buffer)在内存中的LSN
  • log flushed up to: 代表刷到redo log file on disk中的LSN
  • pages flushed up to: 代表已经刷到磁盘数据页上的LSN
  • last checkpoint at: 代表上一次检查点所在位置的LSN

redo log中的checkpoint的LSN是开始往前推进的位置(即是last checkpoint at),即是从该位置开始是还没有写入到磁盘数据页的。就是从该位置开始开始扫描redo-log,并将其应用到buffer-pool中,直到last Checkpoint对应的LSN等于 log flushed up to 对应的 LSN (也就是redo-log磁盘上存储的LSN值),则恢复完成 。

8.刷脏页过程中,redo log会有什么操作吗?数据写入后的最终落盘,是从redo log更新过来的还是从buffer pool更新过来的呢?

首先要知道,磁盘数据页中的也是有LSN的。

举个例子:

buffer pool里是维护着一个脏页列表,假设现在redo log 的 checkpoint 记录的 LSN 为 1100,现在内存中的某一干净页有修改,修改后该页的LSN为1200,大于 checkpoint 的LSN,则在写redo log的同时该页也会被标记为脏页记录到脏页列表中。现在内存不足,该页需要被淘汰掉,该页会被刷到磁盘,磁盘中该页的LSN为1200(刷脏页后,磁盘中的LSN和内存中的就一致,该页也从脏页列表中移除。

若是redo log 需要往前推进checkpoint,到LSN为1200的这条log时,发现内存中的脏页列表里没有该页,且磁盘上该页的LSN也已经为1200,则该页已刷脏,已为干净页,跳过。

所以,刷脏页过程中,redo log是不会有操作的。在奔溃恢复时候,会对比磁盘数据页的LSN和checkpoint的LSN,要是其是相等的,就会跳过该页。

另外,redo log并没有记录数据页的完整数据,所以它并没有能力自己去更新磁盘数据页,也就不存在“数据最终落盘,是由redo log更新过去”的情况。

  1. 如果是正常运行的实例的话,数据页被修改以后,跟磁盘的数据页不一致,称为脏页。最终数据落盘,就是把内存中的数据页写盘。这个过程,甚至与redo log毫无关系。

  2. 在崩溃恢复场景中,InnoDB如果判断到一个数据页可能在崩溃恢复的时候丢失了更新,就会将它读到内存,然后让redo log更新内存内容。更新完成后,内存页变成脏页,就回到了第一种情况的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1531122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言例:(m=a==b)||(n=a==b);求解m,n的值

题目&#xff1a;设int a0,b0,m0,n0;执行语句(mab)||(nab);求解m,n的值。 #include<stdio.h> int main(void) {int a0,b0,m0,n0;(mab)||(nab);printf("m%d\n",m);printf("n%d\n",n);return 0; } 优先级: () 优先 优先 a b -->为真&am…

Linux--文件系统:数据的存储和组织之道

引言 文件系统是计算机操作系统中的重要组成部分&#xff0c;它负责管理计算机存储设备上的数据以及对数据进行组织和访问。一个高效可靠的文件系统对于系统性能和数据安全至关重要。 文件系统的基本概念 文件系统是操作系统中用于管理和存储文件的软件结构。它定义了如何在…

MT6825编码器在STM32中的使用

文章目录 1、PWM 绝对值位置读取功能1.1 DataSheet说明1.2 硬件支持1.3 Cubemax配置及使用1.4 项目代码实现1.5 效果验证1.6 注意事项 2、SPI 绝对值位置读取功能2.2 硬件支持2.3 Cubemax配置及使用2.4 项目代码实现 1、PWM 绝对值位置读取功能 1.1 DataSheet说明 1.2 硬件支持…

【计算机网络篇】物理层(4)信道的极限容量,信道复用技术

文章目录 &#x1f354;信道的极限容量&#x1f6f8;造成信号失真的主要因素⭐码元的传输速率 &#x1f6f8;奈氏准则&#x1f6f8;香农公式&#x1f388;练习 &#x1f5d2;️小结 &#x1f354;信道复用技术⭐常见的信道复用技术&#x1f388;频分复用FDM&#x1f388;时分复…

TouchGFX之性能测量

TouchGFX Core开放了几个信号&#xff0c;可用于测量性能。 当这些信号在内部触发时&#xff0c;用户可在应用程序中同步触发单个GPIO&#xff0c;从而实现“渲染时间”和其他有用信号的可视化。 信号在GPIO.hpp中定义 /* 用于操作GPIO的接口类&#xff0c;以便在目标硬件上进…

ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY

论文题目&#xff1a; ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY 发表会议&#xff1a;ICLR 2022 论文地址&#xff1a;https://openreview.net/pdf?idLzQQ89U1qm_ 论文代码&#xff1a;https://github.com/thuml/Anomaly-Transforme…

“惠才俊·暖同行”成都蓉北商圈“政策进楼宇”系列活动第二站

活动时间 2024年3月27日下午14:00活动地点 四川省成都市金牛区福堤路99号数媒大厦(5楼共享会议室)主办单位 成都蓉北商圈发展服务局 成都市金牛区新经济和科技局 成都树莓信息技术有限公司协办单位 蓉北人力资源服务产业园 主讲单位 蓉北商圈服务局、区新经济和科技局、国…

PyQt上手指南

文章目录 前言PyQt的好处从一个最简单的例子入手PyQt5基础组件体系源码结构 Qt Designer基础布局高级界面Web控件 多线程列表图形绘制PyQt5.QtGuiPyQtGraphmatplotlib和PyQt结合和mplfinance结合 工具使用打包链接 前言 用户界面开发&#xff0c;我搞过visual C MFC、Delphi V…

thinkphp 使用phpmailer发送邮件以及使用消息队列异步解耦发送邮件

邮箱注册配置&#xff1a; 注册163或qq邮箱&#xff0c;开启smtp服务 25端口 ssl则465端口 下载phpmailer composer 安装phpmailer composer require phpmailer/phpmailer设置配置文件 配置文件 书写代码 代码 <?php namespace app\job; use think\facade\Log; us…

安卓(uniapp)上架华为踩坑合集

1.如果是离线打包&#xff0c;注意在manifest那里修改&#xff1a; android:debuggablefalse2…您的应用targetsdk版本低于30&#xff0c;不符合华为应用市场审核标准。 修改建议&#xff1a;请您将应用targetsdk等级升级到30或30以上。 因为之前我升到30被打回来过&#xff…

【LAMMPS学习】三、构建LAMMPS(5)可选的构建设置

3、构建LAMMPS 3.5.可选的构建设置 LAMMPS 可以通过多种可选设置来构建。每个小节都解释了如何使用 CMake 和 make 进行构建。 3.5.1. C11 标准合规性 编译 LAMMPS 需要 C11 标准兼容编译器。 LAMMPS 2020 年 3 月 3 版是核心代码和大多数软件包与之前的 C98 标准兼容的最…

使用 Flink + Faker Connector 生成测试数据压测 MySQL

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

基于java校园在线打印预约系统设计与实现

摘 要 二十一世纪以来&#xff0c;计算机行业应用技术不断发展&#xff0c;人们的观念也在不断改变。传统打印行业&#xff0c;用户已经意识到传统的打印文件方法等待时间太长。校园在线打印预约系统可以通过网络来打印文件&#xff0c;用户可以在特定的时间预约打印文件&#…

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

PSQLException:limit must not be negative

limit must not be negative异常原因及解决 在PostgreSQL中遇到PsqlException: limit must not be negative异常&#xff0c;通常是由于在执行SQL查询时&#xff0c;传递给LIMIT子句的值为负数导致的。LIMIT子句用于限制查询结果的数量&#xff0c;其值必须是非负整数。 解决这…

C++ Qt开发:QUdpSocket实现组播通信

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…

15届蓝桥杯第二期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

Mysql:行锁,间隙锁,next-key锁?

注&#xff1a;以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1&#xff1a;只加了一行写锁&#xff0c;锁住要修改的这一行。语义问题数据一致性问题 猜想2&#xff1a;要修改的这一行加写锁&#xff0c;扫描过程中遇到其它行加读锁猜想3&#xff1a;要修改的这一行加写锁&…

[ C++ ] STL---list的使用指南

目录 list简介 list的常用接口 构造函数 赋值运算符重载 迭代器 容量相关接口 元素访问接口 修改相关接口 头插push_front() 头删pop_front() 尾插push_back() 尾删pop_back() insert() erase() list的迭代器失效 list简介 1. list是可以以O(1)的时间复杂度在任意…

ORACLE 上机操作3-1

sqlplus / as sysdba 显示parameter结构 SQL> set pause on SQL> desc v$parameter 显示系统静态参数 SQL> select name from v$parameter where isses_modifiable FALSE; 显示db_files是否可以用命令修改 SQL> select isses_modifiable, issys_modifiable, ismod…