MySQL如何保证数据的可靠性(保证数据不丢失)

news2025/2/9 2:11:06

1. 结论:

只要redo logbinlog 保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。

2. 机制

WAL机制,(Write Ahead Log): 事务先写入日志,后持久化到磁盘。

3. binlog 写入机制

binlog写入流程图,选自《MySQL45讲》

流程

  • 每个线程内都有一个binlog cache,记录先写入binlog cache,所有线程共享一个binlog文件
  • binlog cache write into binlog file, binlog file 是存储在文件操作系统的page cache中。
  • binlog file 通过 fsync持久化到磁盘。

解释

  • write是内存之间的操作,速度很快。
  • fsync是内存和磁盘之间的操作,速度慢,占据磁盘的IOPS。

写入控制策略

write和fsync的时机可调,参数sync_binlog可以控制

  1. sync_binlog = 0 ,每次提交事务只write, 不fsync.
  2. sync_binlog = 1, 每次提交事务都会执行fsync。
  3. sync_binlog= N, 每次提交事务都write, 但累积N个事务后才fsync,N 的取值范围为(100,1000)。
    通俗理解,sync_binlog 控制的是fsync的时机,处于数据恢复和效率,一般不取0和1,

4. redo log 写入机制

redo log的三种状态

流程

  1. redo log 先写入 redo log buffer中,存储在mysql的进程中。(内存)
  2. 写到(write)page cache, 存储在文件系统的页缓存中。(内存)
  3. 持久化(fsync)到磁盘。

写入控制策略

redo log的写入控制同样是通过参数去调整:innodb_flush_log_at_trx_commit
从参数名就可以看出, 是innodb提供的在事务提交时redo_log的刷盘策略

  1. 设置为0表示 每次事务提交时都把redo log留在 redo log buffer。
  2. 设置为1表示 每次事务提交时都将 redo log 直接持久化到磁盘中。
  3. 设置为2表示 每次事务提交时都只是把redo log 写到page cache。

此外,Innodb存在一个后台线程,每隔1秒,机会将redo lo个buffer中的日志,刷盘到page cache,然后持久化到磁盘中。

5. 两阶段提交机制

两阶段提交
MySQL一般采用的是双“1”策略,就是sync_binlog 和 innodb_flush_log_at_trx_commit都为1。
换言之,一次完整的事务提交需要等待两次刷盘,一次是在redo log(prepare) fsync,一次是在写binlog中fsync。
引发新的问题:
如果MySQL的TPS为每秒2万,按照两阶段提交,每秒机会有四万次写磁盘,但是
磁盘能力就2万每秒,如何实现两万的TPS?
换言之:就是在遇到磁盘瓶颈时,如何优化,减少刷盘次数

组提交机制(group commit)

LSN

在介绍组提交之前,需要了解日志逻辑序列号(log sequence number, LSN),这是一个单调递增,且对应redo log的写入点,每次写入长度为length的redo log, LSN的值就会加上length
这段话比较难理解,可以看图理解。
日志逻辑序列号

redo log 采用组提交的示例

图片来自《MySQL45讲》
在这里插入图片描述

  1. trx1 是第一个到达的,会被选为这组的 leader;
  2. 等 trx1 要开始写盘的时候,这个组里面已经有了三个事务,这时候 LSN 也变成了 160;
  3. trx1 去写盘的时候,带的就是 LSN=160,因此等 trx1 返回时,所有 LSN 小于等于 160 的 redo log,都已经被持久化到磁盘;
  4. 这时候 trx2 和 trx3 就可以直接返回。

总结:一次组提交里面,组员越多,节约磁盘 IOPS 的效果越好。
在并发场景下,为了尽可能多的的在一次组提交内包含更多的组员,第一个事务在写完redo log buffer之后,接下来的fsync需要尽可能的晚调用。

优化

在MySQL 中就有这样的优化:为了让一次fsync带的组员更多,采取拖时间。
将redo log prepare分成两个阶段

  • write: 将redolog cache 写入 page cache
  • fsync:: 将page cache中的redo log 日志持久化到磁盘中。
    将binlog 分成两个阶段:
  • write : 将日志从binlog cache写入page cache中的binlog文件
  • fsync: 将binlog文件持久化到磁盘。

两阶段提交细化
本着拖时间的原则来分析:
将 prepare 阶段的 fsync 拖到binlog的write之后,
同样binlog的fsync 拖到了 redo log的fsync之后,
优化后的方案:redo log 和bin log 都实现了组提交。
区别在于 binlog的组提交带来的优化效果不如 redo log,主要原因是拖的时间不长
大佬原话:
在这里插入图片描述
但是可以通过参数来控制:

  1. binlog_group_commit_sync_delay ;表示延迟多少微秒后才调用 fsync;
  2. binlog_group_commit_sync_no_delay_count ,表示累积多少次以后才调用 fsync。
    两条件是或的关系,满足一个就会调用fsync。

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

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

相关文章

华为OD机试真题 JavaScript 实现【非严格递增连续数字序列】【2022Q4 100分】

一、题目描述 输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列的长度,比如122889属于非严格递增连续数字序列。 二、输入描述 输入一个字符串仅包含大小写字母和数字,输入的字符串最大不超过255个字符…

合金氢化物动力学与瞬时流量计算

在经典的合金氢化物动力学描述中,有一种是用JMAK方程来描述和拟合合金的吸放氢过程,方程很简洁:,其中是反应程度或者百分比,表示合金氢化物吸氢或者放氢的程度,是该合金吸氢或放氢的一种特征常数&#xff0…

57、基于51单片机智能硬币分拣分类机电子存钱罐报警系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+参考PPT+元器件清单等)

摘 要 近年来,随着我国经济的发展和社会的进步,邮政事业得到了空前发展。邮政通信网的技术含量不断增加,技术装备水平也在不断的提高,邮件处理已基本实现机械化,并且朝着自动化的方向迈进。本文着眼于我国当前邮政事…

Unity编辑器扩展-第一集-在菜单栏加入自己的按钮

一、概述 unity自己本身就是一个大的程序,我们看见的所有功能,都是用程序写出来的,但是根据各行各业不同的需求,有些时候我们制作时,想要自己编辑一些原有的功能。 二、本节目标效果展示 1.在菜单栏加入属于自己的一…

【前端基础篇】CSS选择器 和 CSS属性

前言:CSS 简介 CSS 概述 CSS ( Cascading Style Sheet ) 层叠样式表,用来修饰 HTML,使得效果更加多样化CSS 在 HTML4.0 中引入,一般在开发过程中,会使用单独的 CSS 文件进行开发,然后将这个独立 CSS 文件引…

Unity编辑器扩展-第二集-按钮排序/分组/放入右键菜单

第一集链接:Unity编辑器扩展-第一集-在菜单栏加入自己的按钮_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.按钮排序 变成 2.按钮分组 仔细看,有个灰色的杠杠 3.放入右键菜单 4.皮一下 二、按钮排序具体流程 第一集讲,如果想放入…

Java自定义泛型类、泛型接口、泛型方法以及 泛型擦除的细节

体会&#xff1a;使用泛型的主要优点是能够在编译时而不是在运行时检测错误。 /*** 自定义泛型类*/ public class Order<T> {String orderName;int orderId;//类的内部结构就可以使用类的泛型T orderT;public Order(){//编译不通过 // T[] arr new T[10];//编译…

Unity基础3——Resources资源动态加载

一、特殊文件夹 &#xff08;一&#xff09;工程路径获取 // 注意 该方式 获取到的路径 一般情况下 只在 编辑模式下使用 // 我们不会在实际发布游戏后 还使用该路径 // 游戏发布过后 该路径就不存在了 print(Application.dataPath);&#xff08;二&#xff09;Resources 资…

如何自动生成正交法测试用例?

目录 引言 正交法实验 自动生成正交用例 引言 正交法测试用例是一种高效且可靠的方法&#xff0c;能够最大限度地减少测试工作量&#xff0c;同时保证覆盖所有可能的组合情况。通过了解如何优化这些测试用例的生成过程&#xff0c;可以提高产品的质量&#xff0c;降低故障率…

机器人视觉梳理(上)

原创 | 文BFT机器人 01 机器人视觉的概念 在智能制造过程中&#xff0c;通过传统的编程来执行某一特定动作的机器人&#xff08;机械手、机械手臂、机械臂等&#xff0c;未作特殊说明时&#xff0c;不作严格区分&#xff0c;统一称为机器人&#xff09;&#xff0c;将难以满足制…

【CV大模型SAM(Segment-Anything)】如何保存分割后的对象mask?并提取mask对应的图片区域?

上一篇文章【CV大模型SAM&#xff08;Segment-Anything&#xff09;】真是太强大了&#xff0c;分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标中详细介绍了大模型SAM&#xff08;Segment-Anything&#xff09;的不同使用方法&#xff0c;后面有很多小伙伴给…

【JVM 监控工具】使用JConsole监控进程、线程、内存、cpu、类情况

文章目录 前言一、如何启动JConsole二、如何设置JAVA程序运行时可以被JConsolse连接分析三、JConsole如何连接远程机器的JAVA程序&#xff08;举例说明&#xff09;四、性能分析概述内存线程类VM摘要MBean 五、使用Jconsole监控某方法的性能总结 前言 Jconsole是JDK自带的监控…

网络工程师必备,华为/思科/华三交换机命令对比

本期对华为/思科/华三交换机配置命令对比,来看下他们的区别在哪里&#xff0c;这里对命令做了个汇总&#xff0c;平时对命令不熟的朋友这次可以看下。 另外我们来看下华为与H3C的命令情况&#xff0c;方便大家进行对比。 一、华为交换机基础配置命令 1、创建vlan&#xff1a; …

Unity基础1——3D数学

一、Mathf &#xff08;一&#xff09;Mathf 和 Math ​ Math 是 C# 中封装好的用于数学计算的工具类 —— 位于 System 命名空间中 ​ Mathf 是 Unity 中封装好的用于数学计算的工具结构体 —— 位于 UnityEngine 命名空间中 ​ 他们都是提供来用于进行数学相关计算的 ​…

机器学习 day18(用Tensorflow搭建一个神经网络)

之前搭建神经网络的方法 先初始化输入数据X&#xff0c;创建layer 1并计算激活值a1&#xff0c;创建layer 2并计算激活值a2&#xff0c;这是前向传播代码的显式形式。 另一种简单些的创建神经网络的方法 创建layer 1和layer 2与前一种方法相同&#xff0c;但我们不需要手动…

JUC并发编程学习笔记

1&#xff1a;回顾多线程 进程和线程是什么 进程是操作系统分配资源的最小单元&#xff0c;而线程是cpu调度的最小单元。 java默认有几个线程 2个,main线程和GC线程&#xff08;GC垃圾回收机制&#xff09; java可以开启线程么 不能 并发和并行 并发,多线程操作同一个资源,cp…

纯电驱动车辆动力总成的优化与比较研究

摘要&#xff1a; 不同动力总成拓扑结构的对比分析 前言 纯电驱动的电动汽车因为集成有大容量电池组&#xff0c;可以存储取自公共电网的电能&#xff0c;用来驱动车辆的行驶。相比于传统的混合动力汽车&#xff0c;具有更加优越的节能减排效果和潜力。因此&#xff0c;近年来…

cpp文件编译过程 makefile cmake

这里写目录标题 argc argv参数头文件编译过程静态链接&#xff0c;动态链接&#xff0c;静态库&#xff0c;动态库 -shared制作使用动态库libxxx。so冲突 静态库预处理编译汇编链接目录选项-Idir 大写Iinclude<> 与 " "-I -I- 与 -I- -I ld/objdump/objcopy 选…

内网渗透—隧道搭建Ngrok与Frp内网穿透

这里写目录标题 1. 前言1.1. 隧道技术介绍1.2. 代理技术介绍1.2.1. 正向代理1.2.2. 反向代理1.2.3. 透明代理1.2.4. 正向代理与透明代理区别 2. 内网穿透2.1. Ngrok2.1.1. 访问Ngrok2.1.2. 代理设置2.1.2.1. 开通代理2.1.2.2. 配置隧道2.1.2.3. 下载客户端 2.1.3. 配置客户端2.…

P20[6-8]编码器接口测速(软)

与外部中断编码器逻辑不同,此处编码器使用的是定时器方法 1.Encoder编码器部分: #include "stm32f10x.h" // Device header void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCm…