Mysql日志:undo log、redo log 、bin log、两阶段提交

借鉴:
https://blog.csdn.net/Huangjiazhen711/article/details/127900821
https://blog.csdn.net/qq_42757463/article/details/132618759
https://blog.csdn.net/weixin_62458944/article/details/132721814
https://blog.csdn.net/m0_73311735/article/details/127935751

一:Mysql日志:undo log (和事务相关:记录数据)

1.保证事务的原子性:

每当我们要对一条记录做改动时(这里的改动可以指INSERT、DELETE、UPDATE),把回滚时所需的东西记下来。比如:
(1)你插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的时候只需要把这个主键值对应的记录删
掉就好了
(2)你删除了一条记录,至少要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入
到表中就好了
(3)你修改了一条记录,至少要把修改这条记录前的旧值都记录下来,这样之后回滚时再把这条记录更新为旧值

在这里插入图片描述

MySQL处于性能考虑,数据会优先从磁盘加载到Buffer Pool中,在更新Buffer Pool中数据之前,会优先将数据记录到undo log中。记录undo log日志,MySQL不会直接去往磁盘中的xx.ibdata文件写数据,而是会写在undo_log_buffer缓冲区中,因为工作线程直接去写磁盘太影响效率了,写进缓冲区后会由后台线程去刷写磁盘。

2.分两种格式的undo log:
(1)insert undo log格式:记录的是insert 语句对应的undo log

在这里插入图片描述

(2)update undo log格式:
在这里插入图片描述

二:Mysql日志:redo log (和事务相关:记录数据)

1.作用:mysql服务崩溃后,事务恢复。保证了事务的持久性。

update包含两步操作,先查询到对应的行记录,再根据条件进行更新操作。如果没有redo log的话,MySQL每次的update操作都要更新磁盘文件,整个过程的I/O成本和查询成本都很高。更新数据优先存在缓存中,事务提交之后再刷redo log 持久化到磁盘

在这里插入图片描述
图中的步骤:
(1):从磁盘加载数据到内存
(2):在内存中修改数据
(3):把新数据写到Redo Log Buffer中
(4):把Redo Log Buffer中数据持久化到Redo Log文件中
(5):把Redo Log文件中数据持久化到数据库磁盘中
2.为什么需要写Redo Log Buffer和Redo Log FIle?直接将持久化到磁盘不好吗?
直接写磁盘会有产生严重的性能问题:
(1):InnoDB在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源。
(2):一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能更差。

这种方案叫做WAL(Write-Ahead Logging),预写日志,就是先写日志,再写磁盘。写入redo log的方式使用了追加操作,所以操作顺序是顺序写。

3.redo log什么时候刷到磁盘
(1):MySQL正常关闭时。
(2):当redo log buffer中记录写入量大于其内存空间的一半的时候,会触发落盘。
(3):InnoDB的后台线程每隔1s,将redo log buffer持久化到磁盘。
(4):每次事务提交时都将缓存在 redo log buffer 里的 redo log 直接持久化到磁盘。

三:Mysql日志:bin log (不管有没有事务都有bin log:记录sql或者数据)

1.作用:
(1)数据恢复,如果MySQL数据库意外挂了,可以利用bin log进行数据恢复,因为该日志记录所有数据库所有的变更,保证数据的安全性。
(2)数据复制,利用一定的机制将主节点MySQL的日志数据传递给从节点,实现数据的一致性,实现架构的高可用和高性能。

2.日志内容:
(1)查看bin log位置:通过命令show variables like ‘%log_bin%’;查看bin log最终输出的位置。
在这里插入图片描述

log_bin_basename: 是bin log日志的基本文件名,后面会追加标识来表示每一个文件
log_bin_index: 是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录

(2)通过 SHOW BINARY LOGS;查看当前的二进制日志文件列表及大小,如下图:
在这里插入图片描述

(3)修改 bin log位置:修改MySQL的my.cfg或my.ini配置

#启用二进制日志
log-bin=cxw-bin
binlog_expire_logs_seconds=600
max_binlog_size=100M
复制代码

log-bin: bin log日志保存的位置
binlog_expire_logs_seconds: bin log日志保存的时间,单位是秒
max_binlog_size: 单个bin log日志的容量

(4)查看日志内容:show binlog events命令工具查看bin log日志

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
复制代码

IN ‘log_name’ :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)

在这里插入图片描述

(5)bin log格式:默认是ROW类型
在这里插入图片描述
Statement格式:每一条会修改数据的sql都会记录在bin log中
优点:不需要记录每一行的变化,减少了bin log日志量,节约了IO,提高性能。
缺点:比如sql中存在函数如now()等,依赖环境的函数,会导致主从同步、恢复数据不一致

ROW格式:为了解决Statement缺点,记录具体哪一个分区中的、哪一个页中的、哪一行数据被修改了
优点:清楚的记录下每一行数据修改的细节,不会出现某些特定情况下 的存储过程,或function无法被正确复制的问题。
缺点:比如对ID<600的所有数据进行了修改操作,那么意味着很多数据发生变化,最终导致同步的log很多,那么磁盘IO、网络带宽开销会很高。

Mixed格式: 混合模式,即Statment、Row的结合版

对于可以复制的SQL采用Statment模式记录,对于无法复制的SQL采用Row记录

四:两阶段提交:选redo log 再bin log

在这里插入图片描述
事务提交后,redo log和binlog都要持久化到磁盘,但这两个是独立的逻辑,可能出现版成功的状态,这样就造成两份日志之间的逻辑不一致:
(1)如果在redo log刷入磁盘之后,MySQL突然宕机了,而binlog还没有来得及写入。
(2)如果在将binlog刷入磁盘之后,MySQL突然宕机了,而redo log还没来得及写入。也会导致主从不一致。

1.两阶段提交作用: 保证了两个日志文件的数据一致性
2.两阶段提交的缺点是性能更差:磁盘I/O次数高

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

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

相关文章

如何通过ETLCloud的API对接功能实现各种SaaS平台数据对接

前言 当前使用SaaS系统的企业越来越多&#xff0c;当我们需要对SaaS系统中产生的数据进行分析和对接时就需要与SaaS系统提供的API进行对接&#xff0c;因为SaaS一般是不会提供数据库表给企业&#xff0c;这时就应该使用ETL&#xff08;Extract, Transform, Load&#xff09;的…

Potplayer播放器远程访问群晖WebDav本地资源【内网穿透】

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav 国内流媒体平台的内容…

线上盲盒小程序的优势

目前&#xff0c;我国盲盒市场规模即将达到300亿元&#xff0c;盲盒已经进入了发展的爆发期。 盲盒 随着人们的生活水平不断提高&#xff0c;对消费市场要求也越来越高。面对大家不断升级的消费体验&#xff0c;盲盒也是抓住了消费者的好奇心和惊喜感&#xff0c;消费者在购买…

如何下载知网论文、专利的PDF格式

知网的论文格式有其特有的格式&#xff1a;CAJ。将CAJ格式转化为Word或者PDF非常麻烦&#xff0c;且会出现乱码的情况&#xff0c;直接用知网官方的CAJ浏览器也不太方便。为此&#xff0c;困扰了许久。 其实&#xff0c;知网可以直接下载PDF格式&#xff0c;只需在浏览器上安装…

layui 树组件tree 通过API获取数据

一、简单 var treedata[];tree.render({elem: #addLeftType,id: demoId,data: treedata,showCheckbox: true,oncheck: function(obj){console.log(obj.data); // 得到当前点击的节点数据console.log(obj.checked); // 节点是否被选中console.log(obj.elem); // 得到当前节点元素…

真VS假(数字化前提)

元宇宙最近消停了很多&#xff0c;起始这个词刚出来的时候&#xff0c;很多人搞不清楚&#xff0c;元宇宙就是看待真假一个典范。如果对真假有个清晰的认知&#xff0c;那么对于看待很多事情&#xff0c;会给您带来不一样的视角&#xff0c;不仅仅是对企业数字化&#xff0c;可…

【DOM笔记四】事件高级!(注册/删除事件、DOM事件流、事件对象、事件委托、鼠标 / 键盘事件、相关案例)

文章目录 7 事件高级7.1 注册事件概述7.2 删除事件7.3 DOM事件流7.4 事件对象7.5 事件委托7.6 鼠标事件7.6.1 常用的鼠标事件7.6.2 鼠标事件对象 7.7 键盘事件7.7.1 常用的键盘事件7.7.2 键盘事件对象 7 事件高级 7.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或…

从零开始构建高效的网校平台:在线教育系统源码的开发指南

随着科技的不断发展&#xff0c;在线教育在现代社会中变得愈发重要。本文将为您提供一份详尽的指南&#xff0c;从零开始构建高效的网校平台&#xff0c;覆盖在线教育系统源码的关键开发步骤。 第一步&#xff1a;明确需求和目标 在开始之前&#xff0c;明确您的网校平台的需…

基于深度学习的动物检测识别系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5 yolov5主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

青少年CTF-qsnctf-Web-Queen

题目环境&#xff1a; 题目难度&#xff1a;★★ 题目描述&#xff1a;Q的系统会不会有漏洞&#xff1f; 看到了登录窗口&#xff0c;使用burp suite工具进行抓包 burp suite抓包 admin 1 Repeater重放Send放包 Your IP is not the administrator’s IP address! 您的IP不是管理…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B

老规矩&#xff0c;看目录&#xff0c;平均3-5题 文章目录 A/B2023真题&#xff08;2023-19&#xff09;-A-选项特点&#xff1a;两个等号&#xff1b;-判断需联立的难易&#xff1a;难&#xff0c;看着感觉需要联立&#xff0c;所以判断联立需要有理论支撑&#xff0c;不然还…

Gin之GORM多表关联查询(多对多;自定义预加载SQL)

数据库三个,如下: 注意:配置中间表的时候,表设计层面最好和配置的其他两张表契合,例如其他两张表为fate内的master和slave;要整合其对应关系的话,设计中间表的结构为master_id和slave_id最好(不然会涉及重写外键的操作) 重写外键(介绍) 对于 many2many 关系,连接表…