MySQL:三大日志(binlog、redolog、undolog)

再了解三个日志前我们先了解一下MySQL的两层架构:

  • Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数和所有跨存储引擎的功能都在 Server 层实现。
  • 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

这三个日志其中binlog是Server层的,而redolog和undolog是Innodb储存引擎层的。

1、binlog(归档日志)

        这个日志记录了所有对数据库的数据、表结构、索引等等变更的操作,不会记录查询类的操作。也就是说只要是对数据库有变更的操作都会记录到binlog里面来。再事务提交后,会将这个事务生成的binlog日志统一写入到binlog日志文件中去。

 1.1记录格式:

  • STATEMENT(默认):每一条修改数据的 SQL 都会被记录到 binlog 中,但 STATEMENT 有动态函数的问题,比如你用了 uuid 或者 now 这些函数,你在主库上执行的结果并不是你在从库执行的结果,这种随时在变的函数会导致复制的数据不一致;
  • ROW:记录行数据最终被修改成什么样了,不会出现 STATEMENT 下动态函数的问题。但 ROW 的缺点是每行数据的变化结果都会被记录,比如执行批量 update 语句,更新多少行数据就会产生多少条记录,使 binlog 文件过大,而在 STATEMENT 格式下只会记录一个 update 语句而已;
  • MIXED:包含了 STATEMENT 和 ROW 模式,它会根据不同的情况自动使用 ROW 模式和 STATEMENT 模式;

 1.2写入策略:

        进行事务的过程中,会先把产生的binlog写入到binlog cache中,事务commit(提交)的时候再写入到日志文件当中,而这个日志文件是否写入磁盘,再根据参数 sync_binlog来决定这个事务的binlog日志是否马上写入到磁盘中。

1、sync_binlog=0 的时候,表示事务结束以后不会立马写入到磁盘当中,只会先写入到日志文件当中,而具体什么是写入磁盘由操作系统决定;

2、sync_binlog=1 的时候,表示每次提交事务都会将日志文件写入到磁盘 ;

3、sync_binlog的值大于1 的时候,表示每次提交事务都先写到page cach,只有等到积累了N个事务之后才写入到磁盘。但这样可能会丢失sync_binlog数的事务日志的风险;

 1.3 作用

        binlog的主要作用是用于数据复制,再数据库主从架构中,主数据库接受更新请求,而从数据库接收查询请求。这样再加锁时主数据再收写到锁封锁时,从数据库也还能接收查询请求。而保证主从数据库数据一致性用到的就是Binlog日志。它记录了修改主数据库所有修改数据的操作,从数据库只需要按照这个日志就能实现数据复制了。

        ps:binlog中记录的是全量数据,所以一旦数据库不小心误删了,也完全可以根据binlog创建出有 个一模一样的数据库。

2、undo log(回滚日志)

        undo log记录的是事务开启前的原本的数据,万一事务失败需要恢复到事务执行前的状态,undo log完全可以做到。

  • 执行的是修改语句时,就将这行将要更新行的旧值保存下来带回滚时直接恢复就好。
  • 执行的是新增语句,将新增数据行的主键记录下来,待回滚时根据主键进行删除就好。
  • 执行的时删除语句时,将要删除的一整行数据记录下来,待回滚时再插入进去。

 2.1 记录格式

每一次更新操作产生的 undo log 格式都有一个 roll_pointer 指针和一个 trx_id 事务id

  • trx_id记录事务号,表示此时变化是在那个事务中产生的。
  • roll_pointer 指针则是将这些日志连接起来,也就是所说的版本链。

 2.2 写入策略 

        undo log 和数据页的刷盘策略是一样的,都需要通过 redo log 保证持久化。buffer pool 中有 undo 页,对 undo 页的修改也都会记录到 redo log。redo log 会每秒刷盘,提交事务时也会刷盘,数据页和 undo 页都是靠这个机制保证持久化的。

 2.3 作用

        undo log的作用有两个。保证事务的原子性,实现回滚操作。配合ReadView实现MVCC。

  • 如果出现了错误或者用户执 行了 ROLLBACK 语句,MySQL 可以利用 undo log 中的历史数据将数据恢复到事务开始之前的状态。
  • undo log 为每条记录保存多份历史数据,MySQL 在执行快照读(普通 select 语句)的时候,会根据事务的 Read View 里的信息,顺着 undo log 的版本链找到满足其可见性的记录。

3、redo log(重做日志)

      redo log 是物理日志,记录了某个数据页做了什么修改,比如:对 XXX 表空间中的 YYY 数据页 ZZZ 偏移量的地方做了AAA 更新,每当执行一个事务就会产生这样的一条或者多条物理日志。在事务提交时,只要先将 redo log 持久化到磁盘即可,可以不需要等到将缓存在 Buffer Pool 里的脏页数据持久化到磁盘。当系统崩溃时,虽然脏页数据没有持久化,但是 redo log 已经持久化,根据 redo log 的内容,将所有数据恢复到最新的状态。这redo log不光记录数据的变化,还记录着undo log的记录变化。

        redo log记录的事务完成后的数据新值。事务提交之前发生了崩溃,重启后会通过 undo log 回滚事务,事务提交之后发生了崩溃,重启后会通过 redo log 恢复事务。

        修改一个数据的过程是:

  1. 先使用undo log记录修改前的值
  2. 然后判断缓存(Buffer Pool )中是否有这个数据,如果有则直接修改这个缓存页,并将这个缓存页标志为脏缓存页。
  3. 然后通过redo log记录这个修改的操作,并写入磁盘。为了减少磁盘I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。
  4. 待事务提交再生成此次的binlog。

WAL 技术指的是, MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上

不是说要减少IO嘛,为什么要将redo log写入磁盘,后面还是要将脏数据写入磁盘,多此一举。

写入 redo log 的方式使用了追加操作, 所以磁盘操作是顺序写,而脏数据写入磁盘要先找到数据再磁盘的位置,然后再进行修改,那个是随机写。

顺序写比随机写效率高很多。

3.1 写入格式

r        edo log 是为了防止 Buffer Pool 中的脏页丢失而设计的,那么如果随着系统运行,Buffer Pool 的脏页刷新到了磁盘中,那么 redo log 对应的记录也就没用了,这时候我们擦除这些旧记录,以腾出空间记录新的更新操作。redo log 是循环写的方式,相当于一个环形。

3.2写入策略

当然redo log也不是直接写入磁盘当中,他也有缓存,会先写入缓存当中,至于什么是写入磁盘有下面几种情况:

  • MySQL 正常关闭时;
  • 当 redo log buffer 中记录的写入量大于 redo log buffer 内存空间的一半时,会触发落盘;
  • InnoDB 的后台线程每隔 1 秒,将 redo log buffer 持久化到磁盘。
  • 每次事务提交时都将缓存在 redo log buffer 里的 redo log 直接持久化到磁盘(这个策略可由 innodb_flush_log_at_trx_commit 参数控制,下面会说)。
  • innodb_flush_log_at_trx_commit=0 ,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;
  • innodb_flush_log_at_trx_commit=1,表示每次事务提交时都将 redo log 直接持久化到磁盘;
  • innodb_flush_log_at_trx_commit=2,表示每次事务提交时都只是把 redo log 写到 page cache(操作系统文件缓存)。

3.3 作用

  • 实现事务的持久性,让 MySQL 有 crash-safe (奔溃恢复)的能力,能够保证 MySQL 在任何时间段突然崩溃,重启后之前已提交的记录都不会丢失;
  • 将写操作从「随机写」变成了「顺序写」,提升 MySQL 写入磁盘的性能。

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

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

相关文章

Unity读书系列《Unity3D游戏开发》——拓展编辑器(一)

文章目录 前言一、扩展Project视图1、右键扩展菜单(Asset)2、监听事件3、拓展布局 二、扩展Hierarchy视图1、拓展菜单(GameObject)2、拓展布局3、重写菜单 三、扩展Inspector视图1、扩展原生组件2、扩展继承组件 四、扩展Scene视图…

【每日一题】5.LeetCode——环形链表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

【智能家居入门之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据,之后会持续发布如下项目:①可以实现微信小程序控制下位机动作,真正意义上的智能家居;②将网络通讯协议换成MQTT协议再实现上述功能,此时的服务器也不再是ONENET&…

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法,它将连续的相同字符(重复 2 次或更多次)替换为字符和表示字符计数的数字(行程长度)…

MyBatis详解(6)-- 分页及缓存

MyBatis详解(6) 分页缓存特点:限制:术语:加载分类立即加载:延迟加载:mybatis缓存: 缓存的适用性MyBatis 缓存分类一级缓存注意:一级缓存未命中二级缓存二级缓存的优劣自定…

qq通讯录怎么关闭?QQ好友删除了怎么恢复?

在QQ中,通讯录是我们管理好友和进行聊天的重要工具,但有时候我们可能需要一些隐私保护,不让一些用户通过手机通讯录添加自己。如果您正在思考qq通讯录怎么关闭以及恢复意外删除的好友,本文将为您详细介绍如何关闭QQ通讯录和恢复被…

php实现多进程的几种方式

目录 一:使用pcntl扩展库 二:使用Swoole扩展 三:使用多进程模式PHP-FPM 在PHP中实现多进程主要有以下几种方式: 一:使用pcntl扩展库 pcntl扩展库提供了多线程相关的函数,如pcntl_fork()用于创建子进程…

详解操作系统各章大题汇总(死锁资源分配+银行家+进程的PV操作+实时调度+逻辑地址->物理地址+页面置换算法+磁盘调度算法)

文章目录 第三章:死锁资源分配图例一例二 第三章:银行家算法第四章:进程的同步与互斥做题步骤PV操作的代码小心容易和读者写者混 1.交通问题(类似读者写者)分析代码 2.缓冲区问题(第二个缓冲区是复制缓冲区…

RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

从零开始做题:逆向 ret2shellcode orw

1.题目信息 BUUCTF在线评测 下载orw时防病毒要关闭 2.题目分析 orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护,并不能getshell。只能通过orw的方式拿到flag。 fdopen(‘./flag’); # 打开flag文件,得到fd…

Android MTE技术详解

1.MTE概念 MTE(内存标记扩展)是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中,类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂,不适用于广泛部署(仅调试使用)。MTE当前…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi,大家好,我是源于花海。本文主要使用数据标注工具 Labelme 对猫(cat)和狗(dog)这两种训练样本进行标注,使用预训练模型 VGG16 作为卷积基,并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

单张图像三维重建RealFusion 360◦ Reconstruction of Any Object from a Single Image

Luke Melas-Kyriazi, Iro Laina, Christian Rupprecht, Andrea Vedaldi.RealFusion 360◦ Reconstruction of Any Object from a Single Image。RealFusion: 360 Reconstruction of Any Object from a Single Image Abstract We consider th…

升降机SEW MOVIDRIVE变频器设置

SEW变频器Startup 安装好MOVITOOL软件 打开项目开始配置通信连接 以太网连接为例 在此栏输入需要连接的SEW变频器的IP地址,例如:172.25.20.120 设置完成单击“OK” 当设置完成后,请一路OK回到软件管理画面 通信配置正确的软件界面状态 单击红色刷新图标 一切准备就绪后…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法: Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值,但是如果传入 HttpRequest 对象具有一个ur…

Pytest 识别case规则

一、Python测试框架,主要特点有以下几点: 简单灵活,容易上手;支持参数化;能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytestrequests…

C#简单使用Yolov5的Onnx格式模型进行目标检测

背景 最近要离职了,同事需要了解一下C#如何使用yolov5系列onnx格式模型进行目标检测,由于其对C#不熟练,可能会影响公司后续的开发进度,所以趁着还在,赶紧把手尾搞好。 方案 1、创建一个C# DotNet 8 控制台项目[可千…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台,被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡,以实现数据采集和分析。 系统主要…