MySQL 学习(九)bin log 与 redo log 的区别有哪些,为什么快速恢复使用 redo log 而不用 bin log?

目录

    • 一、bin log 与 redo log 的区别
      • 1)实现方式不同:
      • 2)日志内容不同:
      • 3)记录方式不同:
      • 4)使用场合不同:
    • 二、为什么快速恢复使用 redo log 而不用 bin log?

面试题:bin log 和 redo log 都是作为数据恢复使用的日志文件,二者有什么区别?

一、bin log 与 redo log 的区别

bin logredo log 的作用虽然都是数据恢复,但是二者实际上大不相同,整体可以概括为 四点区别

1)实现方式不同:

  • 实现 redo log 是 InnoDB 引擎特有的;
  • 而 binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

2)日志内容不同:

  • redo log 是 物理日志,记录的是 “在XXX数据页上做了XXX修改”;
  • 而 binlog 是 逻辑日志,记录的是原始逻辑,即对应的 SQL 语句。

什么是 物理日志 和 逻辑日志?

  • 物理日志:记录的是每一个 page 页中 具体存储的值是多少,在这个数据页上做了什么修改。比如:某个事物将系统表空间中的第 100 个页面中偏移量为 1000 处的那个 字节的值从1改为2
  • 逻辑日志:记录的是每一个 page 页中具体数据是怎么变动的,它会记录一个 变动的过程SQL 语句的逻辑。比如:把一个 page 页中的第一个数据从 1 改为 2,再从 2 改为 3,逻辑日志就会记录整个过程:1->2, 2->3。

3)记录方式不同:

  • redo log 是 循环写入文件,空间大小是固定的,需要 写入点(write pos)和 检查点(check point)搭配使用;
  • binlog 是 追加写,空间大小是不固定的,写到一定大小会切换到下一个,并不会覆盖以前的日志。

注意: redo log 文件空间大小虽然是固定的,但一般不止一个文件,当最后一个文件写满时则回溯到第一个文件,进行覆盖写。

为了方便理解 redo log 循环写的实现方式,可以参考下图:

  • 写入点(write point):表示日志当前记录的位置,当 ib_logfile_4 写满后,会从 ib_logfile_1 从头开始记录。
  • 检查点(check point):表示将日志记录的修改写进磁盘,完成 数据落盘。数据落盘后 check point 会将日志上的相关记录擦除掉,即:
    • write pos -> check point 之间的部分是 redo log 空着的部分,用于记录新的日志;
    • check point -> write pos 之间是 redo log 中待落盘的数据修改记录。

注意: 如果 write pos 追上了 check point,表示 redo log 日志写满,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 check point 推进一下。

4)使用场合不同:

  • redo log 作为服务器异常宕机后事务数据自动恢复使用;
  • binlog 可以作为主从复制和数据恢复使用,binlog 没有自动 crash-safe 能力。

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

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

二、为什么快速恢复使用 redo log 而不用 bin log?

最核心的一点就是 两者记录的数据变更粒度是不一样 的。

以修改数据为例:

  • binlog 是以 为记录主体,在 ROW 模式下,binlog 保存的表中每行的变更记录。
  • 由于 MySQL 是以页为单位进行刷盘的,每一页的数据单位为 16K,所以在刷盘的过程中需要把数据刷新到磁盘的多个扇区中去。而把 16K 数据刷到磁盘的每个扇区里这个过程是 无法保证原子性的,如果数据库宕机,那么就可能会造成一部分数据成功过,而一部分数据失败的情况。而通过 binlog 这种级别的日志是无法恢复的,因为一个 update 可能更改了多个磁盘区域的数据,所以这个时候得需要通过 redo log 这种 记录到磁盘数据级别 的日志进行数据恢复。

整理完毕,完结撒花~ 🌻





参考地址:

1.MySQL面试 | bin log与redo log的区别?https://www.bilibili.com/video/BV1h4AkeKENf

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

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

相关文章

用Array.from实现创建一个1-100的数组

一、代码实现 let arr Array.from({length: 100}, (_, i) > i 1); 二、代码分析 1、Array.from(arrayLike, mapFn) (1)arrayLike 类数组对象(如 { length: 100 })本身没有索引属性(如 0: undefined, 1: undefi…

javaScript简单版

简介 JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言,是用来控制网页行为,实现页面的交互效果。 JavaScript和Java是完全不同的语言,不论是概念还是设计。但是基础语法类似。 组成: ECMAScript:规定了JS基础语法核心知…

Python刷题练习

文章目录 1.寻找相同字串2.密钥格式化3.五键键盘的输出4.单词重量5.输出指定字母在字符串的中的索引6.污染水域7.九宫格按键输入8.任务最优调度9.高效的任务规划 1.寻找相同字串 题目描述: 给你两个字符串t和p,要求从t中找到一个和p相同的连续子串,并输…

MATLAB实现振幅调制(AM调制信号)

AM调制是通信专业非常重要的一个知识点。今天我们使用MATLAB编程实现AM调制。 我们实现输入一个载波信号的频率与调制信号的频率后,再输入调幅度,得到已调信号的波形与包络信号的波形,再使用FFT算法分析出已调信号的频谱图。 源代码&#x…

JJJ:linux ida

文章目录 1.总结2.各类函数2.1 分配一个仓库2.2 销毁仓库2.3 从仓库里面分配一个整数id2.4 将上面分配的整数id从仓库里面删除2.5 在指定范围内分配一个id 1.总结 ida使用起来很简单,就是先分配一个仓库一样的实例,再从这个仓库里面分配一个独一无二的整…

FastByteArrayOutputStream和ByteArrayInputStream有什么区别

FastByteArrayOutputStream 和 ByteArrayInputStream 是两种完全不同的 Java I/O 类,它们的主要区别体现在 设计目的 和 使用场景 上。以下是详细对比: 1. 核心区别总结 特性FastByteArrayOutputStream (Spring框架)ByteArrayInputStream (JDK原生)所属…

docker-compose——安装redis

文章目录 一、编写docker-compose.yaml文件二、编写redis.conf文件三、启动docker-compose 一、编写docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…

东芝推出新的SCiB模块,散热性能加倍,适用于电动公交车、电动船舶和固定应用

东京—东芝公司推出了一种新的SCiB模块,这是一种专为电动汽车、电动船舶和固定应用而设计的锂离子电池。新产品采用铝制底板,散热量约为当前模块的两倍。它将于2025年4月中旬在日本和全球上市。 锂离子电池的使用越来越多,而且越来越多样化&a…

【进程控制二】进程替换和bash解释器

【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程,会继承父进程的代码和数据,因此本质上还是在执行父进程的代码 进程替换可以将…

Java基础语法之数组

数组 一、认识数组 1.什么是数组 数组就是一个容器,用来存一批同种类型的数据。 举例 20, 10, 80, 60, 90 int[] arr {20, 10, 80, 60, 90};张三, 李四, 王五 String[] names {"张三", "李四", "王五"};2.为什么要使用数组 假设…

Java死锁排查:线上救火实战指南

想象一下,你正在值班,突然监控告警红成一片,用户反馈雪花般飘来:“系统卡死了!用不了了!” —— 这很可能就是Java应用遭遇了“死锁”这个大魔王。这时候,你就是救火队长,首要任务不…

006-nlohmann/json 结构转换-C++开源库108杰

绝大多数情况下,程序和外部交换的数据,都是结构化的数据。 1. 手工实现——必须掌握的基本功 在的业务类型的同一名字空间下,实现 from_json 和 to_json 两个自由函数(必要时,也可定义为类型的友元函数)&a…

白盒测试——基本路径测试法

一、实验名称 白盒测试——基本路径测试法 二、实验目的 白盒测试是结构测试,是依据被测程序的内部逻辑结构设计测试用例,驱动被测程序运行完成的测试,通过本实验希望: 1、掌握基本路径测试法的基本概念,用具体的例子…

【嵌入模型与向量数据库】

目录 一、什么是向量? 二、为什么需要向量数据库? 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 🔍 示例任务:…

matlab中和三角函数相关的内容

和三角相关的函数 以下内容为Ai输出 函数描述示例sin(x)正弦函数,返回x的正弦值,x单位为弧度sin(pi/2)cos(x)余弦函数,返回x的余弦值,x单位为弧度cos(pi)tan(x)正切函数,返回x的正切值,x单位为弧度tan(pi…

scratch基础-外观模块

一、本次任务 二、内容详解 1、模块介绍 1、说[你好] (2)秒:临时对话框,短暂对话 2、说[你好]:持续显示对话框,长文本显示 3、思考[嗯…] (2)秒:临时显示思考气泡,用于角色思考 4、思考[嗯…] &#xff1a…

TAOCMS漏洞代码学习及分析

路由规则 分为前台和后台&#xff0c; 前台在api.php中 <?php session_start(); include(config.php); include(SYS_ROOT.INC.common.php); $ctrl$_REQUEST[ctrl]; $action$_REQUEST[action]; $mucfirst($action); if(!in_array($m,array(Api,Comment)))d…

Spring @Scheduled注解详解

文章目录 1.Scheduled注解定义2.配置 Scheduled2.1 开启定时任务支持2.2 创建定时任务 3. 常用属性3.1 fixedRate3.2 fixedDelay3.3 cron 4.工作原理4.1 基于TaskScheduler4.2 使用 ThreadPoolTaskScheduler4.3 定时任务的执行流程 5. 延时执行的定时任务5.1 创建定时任务类5.2…

理解计算机系统_并发编程(5)_基于线程的并发(二):线程api和基于线程的并发服务器

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续上一篇理解计算机系统_并发编程(4)_基于线程的并发(一…

使用PhpStudy搭建Web测试服务器

一、安装PhpStudy 从以下目录下载PhpStudy安装文件 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 安装成功之后打开如下界面 点击启动Apache 查看网站地址 在浏览器中输入localhost:88,出现如下页面就ok了 二、与Unity交互 1.配置下载文件路径&#xff0c;点击…