MySQL进阶(日志)——MySQL的日志 bin log (归档日志) 事务日志redo log(重做日志) undo log(回滚日志)

在这里插入图片描述

前言

MySQL最为最流行的开源数据库,其重要性不言而喻,也是大多数程序员接触的第一款数据库,深入认识和理解MySQL也比较重要。

本篇博客阐述MySQL的日志,介绍重要的bin log (归档日志) 、 事务日志redo log(重做日志) 、 undo log(回滚日志)。

本系列文章合集如下:

【合集】MySQL的入门进阶强化——从 普通人 到 超级赛亚人 的 华丽转身

在这里插入图片描述

目录

  • 前言
  • 引出
  • 一、MySQL日志分类
  • 二、Redo Log
    • 1. redo log重做日志的组成
    • 2. 刷盘的时机
  • 三、undo log (事务回滚)
  • 四、Bin log
    • 两阶段提交
    • 为什么需要两阶段提交?
    • MySQL主从复制
  • 总结

引出


1.二进制日志bin log (归档日志)事务日志redo log(重做日志)undo log(回滚日志)
2.bin log用于备份恢复、主从复制;redo log用于掉电等故障恢复;
3.redo log一旦提交意味着持久化了,但是有时候需要对其进行rollback操作,那就需要undo log;
4.主从:写数据时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行;

一、MySQL日志分类

MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志binlog (归档日志)事务日志redo log(重做日志)undo log(回滚日志)

MySQL日志主要包括七种:

  • 1.重做日志(redo log)
  • 2.回滚日志(undo log)
  • 3.归档日志(bin log)
  • 4.错误日志(error log)
  • 5.慢查询日志(slow query log)
  • 6.一般查询日志(general log)
  • 7.中继日志(relay log)

二、Redo Log

redo log(重做日志)是nnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据

(1)redo log是物理日志,纪录页的物理修改操作

  • 记录的是在某个数据页做了什么修改,比如对x表空间中的N数据页ZZZ偏移量的地方做了AAA更新:

(2)保证数据的持久性

  • 持久性,redo log会在事务提交时将日志存储到磁盘redo log file,保证日志的持久性。同时mysql会将数据写入磁盘,保证数据的持久性。

1. redo log重做日志的组成

  • 一是内存中的重做日志缓存,叫做redo log buffer

  • 二是重做日志文件,叫做redo log file

MySQL中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。后续的查询都是先从Buffer Pool中找,没有命中再去硬盘加载,减少硬盘IO开销,提升性能。

更新表数据的时候,也是如此,发现Buffer Pool里存在要更新的数据,就直接在Buffer Pool里更新。然后会把在某个数据页上做了什么修改记录到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面。

redo log的更新流程如下,以一次update操作为例

在这里插入图片描述

在这里插入图片描述

(1)执行Update操作

(2)先将原始数据读从磁盘读取到内存,修改内存中的数据。

(3)生成一条重做日志写入redo log buffer ,纪录数据被修改后的值。

(4)当事物提交时,需要将redo log buffer中的内容刷新到redo log file。

(5)事物提交后,也会将内存中修改的数据写入到磁盘。

为什么需要写Redo Log Buffer 和 Redo Log Flle?

为什么需要写Redo Log Buffer 和 Redo Log Flle?而不是直接持久化到磁盘?

直接写磁盘会有产生严重的性能问题:
(1)InnoDB在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源。
(2)一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能更差。

这种方案叫做WAL(Write-Ahead Logging),预写日志,就是先写日志,再写磁盘.

2. 刷盘的时机

InnoDB存储引擎为redo log的刷盘策略提供了innodb-f1ush_log-at_-trX-commit参数,它支持三种策略:

(1) 0(延迟写) :表示每次事务提交时都只是把redo log留在redo log buffer中,开启一个后台线程,每1s刷新一次到磁盘中;

在这里插入图片描述

(2)1(实时写,实时刷):表示每次事务提交时都将redo log直接持久化到磁盘,真正保证数据的持久性(默认值);

在这里插入图片描述

刷盘的时机为1时,只要事务提交成功,redo log记录就一定在硬盘里,不会有任何数据丢失

如果事务执行期间MySQL挂了或宕机,这部分日志丢了,但是事务并没有提交,所以日志丢了也不会有损失。

(3)2(实时写,延迟刷):表示每次事务提交时都只是把 redo log 写到 page cache,每秒刷一次到磁盘(速度快,但是会丢1s的数据,甚至更多,1s并不严格)

在这里插入图片描述

三、undo log (事务回滚)

redo log一旦提交意味着持久化了,但是有时候需要对其进行rollback操作,那就需要undo log。

undo log是逻辑日志,只是将数据库逻辑的恢复到原来的样子。并不能将数据库物理地恢复到执行语句或者事务之前的样子。虽然所有的逻辑修改均被取消了,但是数据结构和页本身在回滚前后可能不一样了。

既然是逻辑日志,可以理解为它存储的是SQL, 在事务中使用的每一条 INSERT 都对应了一条 DELETE,每一条 UPDATE 也都对应一条相反的 UPDATE 语句。

在这里插入图片描述

undo log实现了事务的一致性,是通过undo log恢复到事务之前的逻辑状态,保证一致性。

在事务没提交之前,MySQL会先记录更新前的数据到undo log日志文件里面,当事务回滚时,可以利用undo log来进行回滚。如下图:

在这里插入图片描述

Undo Logi通过两个隐藏列tx_id(最近一次提交事务的ID)和roll_pointer(上个版本的地址),建立一个版本链,实现回滚到上一个版本。

在这里插入图片描述

四、Bin log

bin log用于备份恢复、主从复制;
redo log用于掉电等故障恢复。

(1) 如果不小心整个数据库的数据被删除了,能使用redo log文件恢复数据吗?

不可以使用redo log文件恢复,只能使用binlog文件恢复。

因为redo log文件是循环写,是会边写边擦除日志的,只记录未被刷入磁盘的数据的物理日志,已经刷入磁盘的数据都会从redo log文件里擦除。

binlog文件保存的是全量的日志,也就是保存了所有数据变更的情况,理论上只要记录在binlog上的数据,都可以恢复,所以如果不小心整个数据库的数据被删除了,得用binlog文件恢复数据。

(2) MySQL在完成一条更新操作后,Server.层会生成一条binlog,Bin Log也是采用WL模式,先写日志,再写磁盘。

事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlogcache写到binlog文件中。

因为一个事务的binlog?不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一块内存作为binlog cache。

至于什么时候刷新到磁盘,可以sync_binlog配置参数指定。

  • 0(延迟写)每次提交事务都不会刷盘,由系统自己决定什么时候刷盘,可能会丢失数据。
  • 1(实时写)每次提交事务,都会刷盘,性能较差。
  • N(延迟写)提交N个事务后,才会刷盘。

加入写Bin Log 后的事务流程

在这里插入图片描述

加入写Bin Log.之后的事务流程,先写处于prepare状态的Redo Log,事务提交后,再写处于commit状态的Redo Log,这就是二阶段提交的概念。

两阶段提交

redo log(重做日志)让 InnoDB 存储引擎拥有了崩溃恢复能力。
bin log(归档日志)保证了MySQL集群架构的数据一致性。

bin log是MySQL Server提供的一种日志,叫做归档日志,所有引擎都可以使用bin log。

redo log是 InnoDB 引擎特有的。
redo log主要记录的是某个数据页做了什么修改,bin log记录的是语句的原始逻辑,比如更新了某一行的某个字段。
redo log是循环写的,数据会被覆盖。bin log是追加写,一个文件写满,就写下一个文件。

两者是如何配合完成两阶段提交的。

在这里插入图片描述

从上图中可以看出,在最后提交事务的时候,有3个步骤:
1.写入redo log,处于prepare状态。
2.写bin log。
3.修改redo log状态变为commit。

先写处于prepare状态的Redo Log,事务提交后,再写处于commit状态的Redo Log。由于redo log的提交分为prepare和commit两个阶段,所以称之为两阶段提交。

为什么需要两阶段提交?

(1) redo log与bin log两份日志之间的逻辑不一致,会出现什么问题?

以updatei语句为例,假设id=2的记录,字段c值是0,把字段c值更新成1,SQL语句为update T set c=1 where id=2。假设执行过程中写完redo log日志后,binlog日志写期间发生了异常,会出现什么情况呢?由于binlog没写完就异常,这时候binlog里面没有对应的修改记录。因此,之后用binlog日志恢复数据时,就会少这一次更新,恢复出来的这一行c值是0,而原库因为redo log日志恢复,这一行c值是1,最终数据不一致。

为了解决两份日志之间的逻辑一致问题,InnoDB存储引擎使用两阶段提交方案。

(2)使用两阶段提交后,写入bin log时发生异常也不会有影响,因为MySQL根据redo log日志恢复数据时,发现redo log还处于prepare阶段,并且没有对应bin log日志,就会回滚该事务。

在这里插入图片描述

(3)再看一个场景,redo log设置commit阶段发生异常,那会不会回滚事务呢?

并不会回滚事务,虽然redo log是处于prepare 阶段,但是能通过事务id找到对应的bin log日志,所以MySQL认为是完整的,就会提交事务恢复数据。

在这里插入图片描述

MySQL主从复制

MySQL的主从复制依赖于bin log,也就是记录MySQL上的所有变化并以二进制形式保存在磁盘上。复制的过程就是将bin log中的数据从主库传输到从库上。

这个过程一般是异步的,也就是主库上执行事务操作的线程不会等待复制binlog的线程同步完成。

MySQL集群的主从复制过程梳理成3个阶段:

  • 写入Bin log:主库写bin log日志,提交事务,并更新本地存储数据,
  • 同步Bin log:把bin log复制到所有从库上,每个从库把bin log写到暂存日志中。
  • 回放Bin log:回放bin log,并更新存储引擎中的数据。

在这里插入图片描述

具体详细过程如下:

  • MySQL主库在收到客户端提交事务的请求之后,会先写入bin log,再提交事务,更新存储引擎中的数据,事务提交完成后,返回给客户端“操作成功的响应。
  • 从库会创建一个专门的/o线程,连接主库的log dump线程,来接收主库的bin log日志,再把bin log信息写入relay log的中继日志里,再返回给主库“复制成功的响应
  • 从库会创建一个用于回放bin log的线程,去读relay log中继日志,然后回放bin log更新存储引擎中的数据最终实现主从的数据一致性。

在完成主从复制之后,你就可以在写数据时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行。

从库数量增加,从库连接上来的/O线程也比较多,主库也要创建同样多的log dump线程来处理复制的请求,对主库资源消耗比较高,同时还受限于主库的网络带宽

所以在实际使用中,一个主库一般跟2~3个从库(1套数据库,1主2从1备主),这就是一主多从的MySQL集群结构。


总结

1.二进制日志bin log (归档日志)事务日志redo log(重做日志)undo log(回滚日志)
2.bin log用于备份恢复、主从复制;redo log用于掉电等故障恢复;
3.redo log一旦提交意味着持久化了,但是有时候需要对其进行rollback操作,那就需要undo log;
4.主从:写数据时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行;

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

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

相关文章

【iOS逆向与安全】某音App直播间自动发666 和 懒人自动看视频

1.目标 由于看直播的时候主播叫我发 666,支持他,我肯定支持他呀,就一直发,可是后来发现太浪费时间了,能不能做一个直播间自动发 666 呢?于是就花了几分钟做了一个。 2.操作环境 越狱iPhone一台 frida m…

Mybatis应用场景之动态传参、两字段查询、用户存在性的判断

目录 一、动态传参 1、场景描述 2、实现过程 3、代码测试 二、两字段查询 1、场景描述 2、实现过程 3、代码测试 4、注意点 三、用户存在性的判断 1、场景描述 2、实现过程 3、代码测试 一、动态传参 1、场景描述 在进行数据库查询的时候,需要动态传入…

Linux友人帐之日志与备份

一、日志 1.1概述 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说也很重要,它记录了系统每天发生的各种事情&#…

openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户

文章目录 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户108.1 创建、修改和删除用户108.2 私有用户108.3 永久用户108.4 用户认证优先规则 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户 使用CREATE USER和ALTER USER可以创建和管理数据…

期中考核复现

web 1z_php ?0o0[]1A&OoO[]2023a include "flag.php":尝试包含名为 "flag.php" 的文件。这意味着它会尝试引入一个名为 "flag.php" 的脚本文件,其中可能包含一些敏感信息或标志。 error_reporting(0):…

MYSQL(事务+锁+MVCC+SQL执行流程)理解

一)事务的特性: 一致性:主要是在数据层面来说,不能说执行扣减库存的操作的时候用户订单数据却没有生成 原子性:主要是在操作层面来说,要么操作完成,要么操作全部回滚; 隔离性:是自己的事务操作自己的数据,不会受到到其…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台,该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元,该板卡具有4个FMC子卡接口(其中有2个为FMC接口)&#x…

机器学习中常见的特征工程处理

一、特征工程 特征工程(Feature Engineering)对特征进行进一步分析,并对数据进行处理。 常见的特征工程包括:异常值处理、缺失值处理、数据分桶、特征处理、特征构造、特征筛选及降维等。 1、异常值处理 具体实现 from scipy.s…

软件测试面试1000问(含文档)

前前后后面试了有20多家的公司吧,最近抽空把当时的录音整理了下,然后给大家分享下 开头都是差不多,就让做一个自我介绍,这个不用再给大家普及了吧 同时,我也准备了一份软件测试视频教程(含接口、自动化、…

kvm webvirtcloud 如何添加直通物理机的 USB 启动U盘

第一步:查看USB设备ID 在物理机上输入 lsusb 命令 rootubuntu:/media/usb1# lsusb Bus 002 Device 002: ID 0781:5581 SanDisk Corp. Ultra Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0424:2514 Microchip Technolo…

进阶课3——神经网络

1.定义与分类 神经网络是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。它由大量的节点(或神经元)相互关联而成,每个节点代表一种特定的输出函数(或称为运算),称为激励…

音乐制作软件 Studio One 6 mac中文版软件特点

Studio One mac是一款专业的音乐制作软件,该软件提供了全面的音频编辑和混音功能,包括录制、编曲、合成、采样等多种工具,可用于制作各种类型的音乐,如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…

On Moving Object Segmentation from Monocular Video with Transformers 论文阅读

论文信息 标题:On Moving Object Segmentation from Monocular Video with Transformers 作者: 来源:ICCV 时间:2023 代码地址:暂无 Abstract 通过单个移动摄像机进行移动对象检测和分割是一项具有挑战性的任务&am…

计算机算法分析与设计(20)---回溯法(0-1背包问题)

文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品,第 i i i 个物品的重量为 W i W_i Wi​,价值为 V i V_i Vi​,对于一个最多能装重量 c c c 的背包,应该如何选择放入包中的物品…

论文-分布式-并发控制-Lamport逻辑时钟

目录 前言 逻辑时钟讲解 算法类比为面包店内取号 Lamport算法的时间戳原理 Lamport算法的5个原则 举例说明 算法实现 参考文献 前言 在并发系统中,同步与互斥是实现资源共享的关键Lamport面包店算法作为一种经典的解决并发问题的算法,它的实现原…

opencalib中lidar2camera安装记录

目录 一、opencalib安装 二、lidar2camera的安装 三、测试运行 四、出现过的问题 一、opencalib安装 代码地址:https://github.com/PJLab-ADG/SensorsCalibration/blob/master/README.md # pull docker image sudo docker pull scllovewkf/opencalib:v1 # Aft…

出海路上离不开的Email营销,教你这样来优化!

随着互联网的不断发展,Email已经成为人们工作和生活中不可或缺的一部分。尤其是对于我们这些跨境企业而言,发送Email是一个促进销售和维护客户关系的良好渠道。而且邮件的价格也是比较低廉的,很适合用于日常推广营销,所以人手几个…

【Linux】nginx基础篇 -- 介绍及yum安装nginx

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

光影之梦2:动画渲染前后对比,揭示视觉艺术的惊人转变!

动画渲染是影视艺术中不可或缺的一环,它赋予了角色和场景鲜活的生命。渲染过程中的光影、色彩、材质等元素,像是画家的调色板,将平淡无奇的线条和形状转化为充满韵味与情感的画面。动画角色仿佛拥有了自己的灵魂,无论是一颦一笑&a…

Unity Inspector编辑器扩展,枚举显示中文,枚举值自定义显示内容

记录!Unity Inspector面板编辑器扩展,枚举显示中文,枚举值自定义显示内容,显示部分选项。效果如下: 枚举类代码: using System.Collections; using System.Collections.Generic; using UnityEngine;public…