redolog和binlog的两阶段提交和区别

news/2024/10/20 17:30:29/

redolog和binlog区别

  • redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑。
  • redo log 是循环写的,空间固定会用完(4个文件,每个文件1G);binlog 是可以追加写入的。“追加写”是指 binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
  • binlog 日志没有 crash-safe 的能力,只能用于归档。而 redo log 来实现 crash-safe 能力。
  • redo log 用于保证 crash-safe 能力。innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘。

crash-safe

CrashSafe指MySQL服务器宕机重启后,能够保证:

  • 所有已经提交的事务的数据仍然存在。
  • 所有没有提交的事务的数据自动回滚。

如果MySQL宕机了,重启后,就需要检查redolog 日志文件里面,系统会自动定位到上次checkpoint的位置,同时,每个数据页中也存在一个LSN,当redo log中的LSN大于数据页中的LSN时,说明重启前redo log中的数据未完全写入数据页中,那么将从数据页中记录的LSN开始,从redo log中恢复数据。

比如redolog 的LSN 是 13000,数据库页的LSN是 10000,那么说明重启前有部分数据未完全刷入到磁盘的数据页中,那么系统将会恢复redo log 中LSN从10000开始到13000的记录到数据页中。把未同步到MySQL的数据同步到磁盘,保证宕机之前的事物数据存到MySQL中去

两段提交

为了保证binlog 和 redolog两份日志最终恢复到数据库的数据是一致的,采用两阶段提交的机制。

例如现在有一个数据更新的sql

update T set c=c+1 where ID=2;
  1. 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内 存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的 一行数据,再调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状 态,更新完成。

两段提交的必要性

假设redo log和binlog分别提交,可能会造成用日志恢复出来的数据和原来数据不一致的情况。

  • 情况一: 先写redolog再写binlog                                                                                              如果在一条语句redolog之后崩溃了,binlog则没有记录这条语句。系统在用binlog恢复从库时便会少了这一次的修改。恢复的从库少了这条更新。
  • 情况二:先写binlog再写redolog                                                                                               如果在一条语句binlog之后崩溃了,redolog则没有记录这条语句(可以理解为主库没有)。系统在用binlog恢复从库时便会多了这一次的修改。恢复的从库多了这条更新。


由此可见,如果不使用两阶段提交,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

两段提交崩溃恢复

采用两阶段提交,在做崩溃恢复(Crash recovery)时分为以下3种情况:

  1. 情况一: binlog无记录,redolog状态prepare                                                                        由于 binlog 还没写,redo log 处于 prepare 状态还没提交,所以崩溃恢复的时候,这个事务会回滚,此时 binlog 还没写,所以也不会传到备库。
  2. 情况二:binlog有记录,redolog状态prepare                                                                  redolog 中的日志是不完整的,处于 prepare 状态,还没有提交,那么恢复的时候,首先检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交事务,如果不存在或者不完整,则回滚事务。
  3. 情况三:binlog有记录,redolog状态commit                                                                           直接提交事务,不需要恢复。


http://www.ppmy.cn/news/1506117.html

相关文章

<数据集>柑橘缺陷识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:1290张 标注数量(xml文件个数):1290 标注数量(txt文件个数):1290 标注类别数:4 标注类别名称:[Orange-Green-Black-Spot, Orange-Black-Spot, Orange-Canker, Orange…

java基础I/O

1,I/O流的概念: IO流代表的是一个数据输入的源或者输出的目标地址,可以是硬盘,内存,网络或者什么其他的电子设备,而IO流的类型也很多比如最简单的字节或者字符,或者其他更高级的对象。 不管它有多少特性&am…

AI10-PaddleDetection2.7安装测试

1、下载PaddleDetect-release-2.7开源项目 https://github.com/PaddlePaddle/PaddleDetection https://github.com/PaddlePaddle/PaddleDetection/releases PaddleDetection: PaddleDetection的目的是为工业界和学术界提供丰富、易用的目标检测模型 2、安装 环境要求 * Paddl…

学习笔记 韩顺平 零基础30天学会Java(2024.8.7)

P481 Math方法 利用random返回一个[2,7]之间的随机数: 因为random只能返回[0,1)之间的随机数,因此做一下处理:[(int)(a), (int) (aMath.random()*(b-a1))],对于Math.random()*(b-a1),其中b-a1,它乘上[0,1)相…

vue实现PC端图片放大缩小可鼠标拖动,鼠标滚轮控制放大缩小完整代码付效果图

vue实现图片放大缩小可鼠标拖动&#xff0c;鼠标滚轮控制放大缩小完整代码付效果图 效果图&#xff1a; 创建一个ImageViewer 组件&#xff0c;并且在当前页面引用完整代码如下&#xff1a; 代码引用&#xff1a; <template><view><image-viewer :imageUrl&q…

Flink 开发语言选择 —— Java vs Scala

引言 Apache Flink 是一个用于处理无界和有界数据流的开源分布式计算框架。随着 Flink 的日益流行&#xff0c;越来越多的开发者开始考虑使用哪种编程语言来进行 Flink 应用程序的开发。本文将探讨在 Flink 中使用 Java 和 Scala 的优缺点&#xff0c;并帮助你做出更明智的选择…

Linux Vim教程

Linux Vim 教程 Vim&#xff08;Vi IMproved&#xff09;是一个强大的文本编辑器&#xff0c;广泛用于编程和系统管理。本文将带你全面了解 Vim 的基础使用、常用命令、高级功能等。 1. 安装 Vim 在大多数 Linux 发行版中&#xff0c;Vim 已经预装。如果没有&#xff0c;可以…

Linux系统使用Docker安装RStudio服务并实现任意浏览器远程访问

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…