细嗦MySQL三大日志

news/发布时间2024/9/20 8:15:57

文章目录

  • 三大日志:binlog(归档日志)、redo log(重做日志)、undo log(回滚日志)
  • redo log
    • 刷盘机制
    • 日志文件组
  • binlog
    • 记录格式
    • 写入机制
  • 两阶段提交
  • undo log
    • 提供回滚操作
    • 提供MVCC(多版本并发控制)

三大日志:binlog(归档日志)、redo log(重做日志)、undo log(回滚日志)

redo log

  • redo log是一个重做日志,是InnoDB引擎独有的,是用于MySQL在挂了之后或者宕机之后恢复数据使用的,保证了数据的持久性和一致性。
  • 在MySQL中数据都是以页为单位的,默认一页16kb,这个参数在配置MySQL的时候可以设置,加载出来的数据页会放入Buffer Pool中,当查询数据的时候会先去Buffer Pool(缓冲池)中查找数据,如果没有,Buffer Pool会从硬盘中加载进来,之后进行修改数据时也是修改的Buffer Pool中的数据,然后将修改的记录记录在redo log buffer(重做日志缓存)中,定期将redo log buffer中的数据同步到redo log中(刷盘机制)。
    在这里插入图片描述

刷盘机制

一般在这几种情况下会进行刷盘:通过innodb_flush_log_at_trx_commit参数进行控制

  • 当事务提交的时候的时候会将redo log buffer中的数据刷新到redo.file文件中。
  • redo log buffer的空间占总容量的一半以上,就需要把这些日志刷新到磁盘中。
  • InnoDB使用了一个事务日志缓冲区(transaction log buffer)来暂时存储事务重做日志,当这个缓冲区满的时候会触发刷盘机制。
  • InnoDB会定期执行检查点操作(Chechpoint),进行刷盘操作,同时将相关重做日志一同刷新。
  • InnoDB 启动了一个后台线程,负责周期性(每隔 1 秒)的刷盘,同时将相关重做日志一同刷新。
  • 正常关闭服务器:MySQL 关闭的时候会进行刷盘。
    在这里插入图片描述
    通过设置参数innodb_flush_log_at_trx_commit 可以有不同的刷盘时机:
  • 设置为0,每次提交事务不进行刷盘操作,这种性能高,但是安全性低,因为这种只能等redo log buffer缓存占一半或InnoDB定期刷盘,如果宕机可能会丢失1S内的事务。
  • 设置为1,每次提交事务都会进行刷盘操作,这种性能低,但是安全性高,因为只要提交事务就会进行刷盘,不会有数据丢失。 如果事务执行期间MySQL挂了或宕机,这部分日志丢了,但是事务并没有提交,所以日志丢了也不会有损失。
  • 设置为2,每次提交事务都只会把redo log buffer 中的内容写到page cache(文件系统缓存),page cache 是专门用来缓存文件的,这里被缓存的文件就是 redo log 文件。这种方式的性能和安全性都介于前两者中间。
  • 刷盘机制innodb_flush_log_at_trx_commit 的默认值为 1,设置为 1 的时候才不会丢失任何数据。为了保证事务的持久性,我们必须将其设置为 1。

日志文件组

硬盘上存储的redo log日志文件不止一个,而是通过一个日志文件组的形式出现的,每一个日志文件的大小相同通过环形拼接而成。
在这里插入图片描述

  • 在日志文件组中还有两个重要属性write pos、checkpoint,相当于头尾指针,write pos 是当前记录的位置,一边写一边后移,checkpoint 是当前要擦除的位置,也是往后推移,每次刷盘记录redo log,write pos位置就会后移,每次MySQL加载日志文件组恢复数据时,会清空加载过得redo log数据,checkpoint就会后移。
  • 如果write pos,后移追上checkpoint,表示日志文件组满了,需要清空一些记录,然后将checkpoint后移。
  • MySQL 8.0.30 及之后的版本中,文件数固定为了32,可以指定innodb_redo_log_capacity的值来设置每个文件的大小,即innodb_redo_log_capacity/32。
    只要每次把修改后的数据页直接刷盘不就好了,还有 redo log 什么事?
    数据页刷盘是随机写,因为一个数据页对应的位置可能在硬盘文件的随机位置,所以性能是很差。如果是写 redo log,一行记录可能就占几十 Byte,只包含表空间号、数据页号、磁盘文件偏移 量、更新值,再加上是顺序写,所以刷盘速度很快。所以用 redo log 形式记录修改内容,性能会远远超过刷数据页的方式,这也让数据库的并发能力更强。

binlog

redo log是物理日志,记录的是在什么数据上做了什么修改,属于InnoDB引擎。binlog属于逻辑日志,主要记录的是原始的逻辑语句,不管什么存储引擎,只要发生了表数据更新操作,都会产生binlog日志,binlog主要用于数据库的备份,主从数据同步,之类的用来保证数据的一致性。

记录格式

binlog日志有三种格式,可以通过binlog_format参数指定。statement row mixed

  • 如果指定statement,binlog中记录的就是sql语句原文,在同步数据的时候会执行sql语句。但是当遇到像记录当前时间的sql,如果是直接执行sql语句的话就会和原数据不一致。
  • 指定为row就不仅仅是记录执行的sql语句,在记录的时候还会包括具体的数据,这样就保证了记录数据的一致性,通常情况下都是指定为row,但是这种格式,需要更大的容量来记录,比较占用空间,恢复与同步数据时会更消耗IO资源,影响执行速度。
  • 指定为mixed是前两种的折中方案,当设置为mixed的时候,binlog中的记录是前两种的混合记录,在记录之前MySQL会先判断这条sql语句是否会引起数据不一致,然后根据判断结果记录相应的格式。

写入机制

binlog写入的过程是,在事务执行过程中,先把日志写到binlog cache中,事务提交的时候再将binlog cache写入到binlog文件中。可以通过binlog_cache_size参数配置binlog cache的大小,如果存储的内容超过这个容量就需要将内容暂时存储在磁盘中。在这里插入图片描述

将数据写入到page cache中是比较快的,只有数据从page cache写入到binlog中才是真正的持久化磁盘的操作。至于这两者的时机,由参数sync_binlog控制,默认是1。

  • 当这个参数为0的时候,每次提交事务都只会将binlog cache中的记录写入page cache,具体什么时候从page cache写入binglog由系统自行判断。虽然性能得到提升,但是机器宕机,page cache里面的 binlog 会丢失。
  • 当参数设置为1的时候,每次提交事务都会将binlog cache中的记录写入page cache并且刷盘到磁盘binlog中。
  • 还有一种方式就是可以设置参数为n,表示每提交n个事务之后进行一次刷盘操作。但是如果机器宕机,就会丢失最近n个事务的binlog日志。

两阶段提交

  • redo log(重做日志)让InnoDB引擎拥有崩溃恢复的能力,binlog(归档日志)保证了MySQL集群架构的数据一致性。虽然都是属于持久化的保证,但是两者的侧重点不同。

  • 在执行更新语句过程中,会记录redo log和binlog两个日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在事务提交时候才写入,所以redo log和binlog写入时机不一样。

  • 因为两者的写入时机不一致,所以会出现一些问题。比如当执行某update语句,将一个n从0修改为了1,在事务提交前redo log日志记录了这次操作,而在事务提交后写入binlog时发生了异常。之后恢复数据的时候主库使用redo log恢复数据n=1,而从库使用binlog恢复数据n=0,出现了数据不一致。

为了解决两份日志之间的逻辑一致问题,InnoDB存储引擎使用两阶段提交方案。
原理很简单,将redo log的写入拆成了两个步骤prepare和commit,这就是两阶段提交。

  • 在事务执行过程中redo log写入会先处于prepare状态,当事务提交记录binlog日志时就会将redo log改为commit状态。在宕机恢复数据时会查看redo log日志的状态,如果发现redo log日志处于prepare状态,并且没有对应的binlog日志,就会回滚该事务。
  • 如果redo log在设置commit阶段发生异常,在恢复数据时,虽然redo log是出于prepare状态,但是能通过事务id找到对应的binlog日志,所以就认为事务是完整的,不会发生回滚,直接提交事务恢复数据。

undo log

我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚,在 MySQL 中,恢复机制是通过 回滚日志(undo log) 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 回滚日志 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。

提供回滚操作

在数据修改的时候,不仅记录了redo log,还记录了相对应的undo log,如果因为某些原因导致事务执行失败了,可以借助undo log进行回滚。

undo log 和 redo log 记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时, undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。

提供MVCC(多版本并发控制)

MVCC,即多版本控制。在MySQL数据库InnoDB存储引擎中,用undo Log来实现多版本并发控制(MVCC)。当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据版本是怎样的,从而让用户能够读取到当前事务操作之前的数据【快照读】。

快照读: SQL读取的数据是快照版本【可见版本】,也就是历史版本,不用加锁,普通的SELECT就是快照读。

当前读: SQL读取的数据是最新版本(最新版本指的是修改且已经提交的数据)。除了在执行修改语句的时候,需要执行当前读,然后再更新数据之外,select语句也有可能是当前读,比如: select … lock in share mode、select … for update。

在更新数据之前,MySQL会提前生成undo log日志,当事务提交的时候,并不会立即删除undo log,因为后面可能需要进行回滚操作,要执行回滚(rollback)操作时,从缓存中读取数据。undo log日志的删除是通过通过后台purge线程进行回收处理的。

事务A执行update更新操作,在事务没有提交之前,会将旧版本数据备份到对应的undo buffer中,然后再由undo buffer持久化到磁盘中的undo log文件中,之后才会对user进行更新操作,然后持久化到磁盘。

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

SQL-Labs靶场“46-50”关通关教程

君衍. 一、四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入 二、四十七关 ORDER BY单引号报错注入1、源码分析2、报错注入3、时间盲注 三、四十八关 ODRER BY数字型盲注1、源码分析2、rand()盲注3、if语句盲注4、时间盲注…

Java进阶(锁)——锁的升级,synchronized与lock锁区别

目录 引出Java中锁升级synchronized与lock锁区别 缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java进阶(锁)——锁的升级,synchronized与lock锁区别 Java中锁升级 看一段代码: public class…

Windows 10 合并磁盘分区 (G and H)

Windows 10 合并磁盘分区 [G and H] 1. 设备和驱动器2. 计算机 -> 管理 -> 存储 -> 磁盘管理3. 删除卷4. 新建简单卷5. 设备和驱动器References 1. 设备和驱动器 2. 计算机 -> 管理 -> 存储 -> 磁盘管理 3. 删除卷 H: -> right-click -> 删除卷 H: 变…

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。 当消息没有到交换机就失败了,就会返回publish-confirm。当消息没有到达MQ时&…

10分钟SkyWalking与SpringBoot融合并整合到Linux中

1.依赖配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.springframe…

【C++】二叉搜索树

目录 介绍&#xff1a; 一&#xff0c;二叉搜索树操作 1&#xff0c;搜索二叉树的简单封装 2&#xff0c;二叉搜索树的查找 3&#xff0c;二叉搜索树的插入 4&#xff0c;二叉搜索树的删除 二&#xff0c;递归实现二叉搜索树的操作 1&#xff0c;二叉搜索树的递归查找 …

AI也来打掼蛋,难道人工智能也能当领导?

引言&#xff1a;探索AI在复杂卡牌游戏中的决策能力 在人工智能&#xff08;AI&#xff09;的研究领域中&#xff0c;游戏被视为现实世界的简化模型&#xff0c;常常是研究的首选平台。这些研究主要关注游戏代理的决策过程。例如&#xff0c;中国的传统卡牌游戏“掼蛋”&#…

新闻网站封锁AI爬虫 AI与新闻媒体博弈继续

随着ChatGPT等新兴AI模型的兴起&#xff0c;它们所依赖的网络爬虫正面临来自全球主流新闻网站的大规模封锁。Richard Fletcher博士团队对十个国家主流新闻网站的统计发现&#xff0c;到2023年底&#xff0c;48%的网站屏蔽了OpenAI的爬虫&#xff0c;24%屏蔽了Google的爬虫。那么…

【IEEEE会议征稿】第六届下一代数据驱动网络国际学术会议(NGDN 2024)

第六届下一代数据驱动网络国际学术会议&#xff08;NGDN 2024&#xff09; The Sixth International Conference on Next Generation Data-driven Networks 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉(IEEETrustCom-2022)成功举办的经验&a…

亚马逊,速卖通,shopee测评补单,如何构建一套完整的环境方案

无论是做普通测评&#xff0c;还是做撸卡撸货&#xff0c;采退的只有在安全稳定的环境下才能不被平台检测&#xff0c;造成被砍单或F号&#xff0c;所以在没有专业团队指导下&#xff0c;建议大家不要轻易尝试&#xff0c;毕竟试错和时间成本才是最大的 进行测评时&#xff0c;…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

vue2使用fabric实现简单画图demo,完成批阅功能

这个功能主要实现批阅的&#xff0c;修改上传的图片&#xff0c;标记内容 看看效果图 主要是根据fabric这个库来进行完成的 下载包 npm i fabric 组件内注册使用 import { fabric } from fabric; 步骤 body中 <divv-if"imgs.length"class"canvas-wrap…

C++之数组

1&#xff0c;概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点1&#xff1a;数组中没干过数据元素都是相同的数据类型 特点2&#xff1a;数组都是连续存放位置组成的 2&#xff0c;一维数组 2.1 一维数组的定义 一维数组定义有三种…

杭电OJ 2018 母牛的故事 C++

思路&#xff1a;有点像是斐波那契数列 #include <iostream> #include <vector> using namespace std; int main() { int n; vector<int> num(56); num[1] 1; num[2] 2; num[3] 3; num[4] 4; for (int i 5; i < num.size(); i) { …

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候&#xff0c;会出现这种情况&#xff1a; mysql -u root -p Enter Password > ‘密码’ 错误&#xff1a;ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者&#xff1a;错误…

VR元宇宙的概念|VR体验店加盟|虚拟现实设备销售

VR元宇宙是一个结合了虚拟现实&#xff08;Virtual Reality&#xff09;和增强现实&#xff08;Augmented Reality&#xff09;等技术的概念&#xff0c;代表着一个虚拟的多维度世界。它是一个由数字化的空间构成的虚拟环境&#xff0c;可以通过虚拟现实设备进行交互和探索。 元…

数据结构从入门到精通——算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度 前言一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例2.4等差数列计算公式2.5等比数列计算方法 三、空间复杂度四、 常见复杂度对比五、 复杂度的oj练习…

RabbitMQ安装

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 RabbitMQ安装下载安装Rabbitmq-server RabbitMQ安装 下载 官…

Ansible stat模块 stat模块 – 检索文件或文件系统状态

目录 语法判断一个不存在的文件 stat模块 – 检索文件或文件系统状态 语法 这里查看/tmp/index.html 这个文件在不 ansible slave -m stat -a path/tmp/index.html判断一个不存在的文件 ansible slave -m stat -a path/tmp/index111.html返回false 说明文件不存在 本章结束…

4.5.CVAT——视频标注的详细步骤

文章目录 1. 跟踪模式&#xff08;基础&#xff09;2. 跟踪模式&#xff08;高级&#xff09;3. 带多边形的轨迹模式 追踪模式Track mode &#xff08;视频标注使用&#xff09;——类似pr的动画效果 1. 跟踪模式&#xff08;基础&#xff09; 使用示例&#xff1a; 为一系列…
推荐文章