Mysql如何保证数据不会丢失,两阶段提交,redo log ,bin log的介绍

一、缓冲池

        首先,关系型数据库是基于磁盘的,而非关系型数据库是基于内存的。

mysql就是一个基于磁盘的数据库,那么是如何减少mysql的i/o次数,提高mysql的性能呢。在mysql中是有一个缓冲池的,mysql每次查询时是按页进行查询的,每个页中会有大量的数据,将这些数据加载到内存中的缓冲池中,下次再进行查找的时候,会先去内存中进行查找,若找不到才会去磁盘中读取。这种方式是很好的,但是会出现缓冲池污染和预读失效的问题,这个就不再详细说了,大家自行了解。

二、刷脏页

        对于mysql来说,那么查询的效率是有了,但是另一个问题是增删改的在缓冲池的基础上是怎么解决的,以下以修改进行说明。在修改的时候,mysql会首先将缓冲池中的数据进行修改,而磁盘上的数据和内存中的数据不一致了,此时该页就是脏页,然后需要将缓冲池中的数据页刷到磁盘中,这个被称为刷脏页。

刷脏页的时机(看一下即可)

  • 每 10 秒必刷新一次
  • 脏页太多时(默认占比超过 innodb_max_dirty_pages_pct 配置的值时刷新)
  • redo log 空间不足时
  • 数据库关闭时

三、binlog

        binlog是mysql的一种二进制日志,用于记录所有对数据库的增删改操作,你每修改一条数据,就会增加一条记录,会记录发生的时间,具体的操作,事务id。

        基于 binlog 的这种特性,一般我们会将 binlog 用于以下几个方面:

        数据库增量备份与恢复:使用备份还原数据后,可以使用 binlog 中记录的内容对备份时间点后的数据进行恢复,所以 binlog 可以恢复到某一具体时间点的数据

        主从复制:通过binlog 实现对主服务器的增量复制。

        审计:通过对 binlog 中的数据进行审计,判断是否存在安全问题,比如 SQL 注入。

bin log的持久化:

        bin log cache 是内存中的一块区域,用于临时存放bin log记录,事务提交后,MySQL 会将 Binlog Cache 中的数据一次性刷新到 binlog 文件中。

当事务提交(COMMIT)时,MySQL 会将 Binlog Cache 中的内容一次性写入 binlog 文件。若事务回滚(ROLLBACK),则会丢弃 Binlog Cache 中的内容。

那么现在有一些问题,当数据在内存中更改后,还需要更改磁盘中的数据和bin_log中的数据,

1、内存更改后,磁盘中的数据更改了,但是bin_log未更改

2、内存更改后,bin_log更改了,但是磁盘中的数据未更改

3、内存更改后,bin_log和磁盘中的数据均未更改

4、bin_log中存放的数据会不会越来越大,又可能比源数据存放占用的位置都大

前三个均为事务不能持久化的问题,所有就有了redo_log

四、redo_log 重做日志

        主要用于崩溃恢复

        数据页在缓冲池中被修改会变成脏页。如果这时宕机,脏页就会失效,这就导致我们修改的数据丢失了,也就无法保证事务的持久性。若一修改就刷脏页,会出现大量i/o,效率降低。

        保证数据不丢,就是 redo log 的一个重要功能——保证事务的持久化

        WAL(Write-Ahead Logging,日志先行),即:事务提交前先写日志,再修改页。也就是说,事务提交,修改内存中的数据,然后写入redo log一条记录,然后mysql的后台线程会根据情况进行脏页的刷新。

        然后一旦脏页刷新,那么redo log中的相关记录就会失效,所以redo log该文件可以回头继续使用。

        redo log的持久化(将redo log文件放在磁盘中)

        redo log buffer 是内存中的一片区域,即先在内存中存放redo log 的记录,然后等到事务结束会将redo log buffer 写入磁盘中的redo log文件中。

总结:开始事务——用户写sql修改数据——修改内存中的数据——每修改一次就会写到redo log buffer 中一条数据——用户sql执行完毕,事务结束——将redo log buffer 中的所有数据写入到磁盘中——mysql的服务器会在合适的时候将脏页刷入磁盘中——此时redo log 中的记录这些操作的相关数据就失效了——下次将redo log buffer中的数据写入磁盘中时,可以从头开始。

        redo_log buffer并不一定是每次都是在事务结束后才把数据写入磁盘中的,那样有的情况下就太慢了。

可以在以下时机将 redo log buffer 中的记录刷新到磁盘

  • 每秒刷新一次
  • 事务提交时
  • redo log buffer 剩余空间小于 1/2 时

五、如何利用redo log恢复宕机的数据呢

        InnoDB 为 redo log 记录了序列号,这被称为 LSN(Log Sequence Number),可以理解为偏移量,越新的日志 LSN 越大。InnoDB 用检查点(checkpoint_lsn)记录未被同步到磁盘中的数据,即记录redo log中的数据 ,记录哪一部分还有用。

六、当我们执行一条update sql的流程

        innodb

  1. 服务器收到事务开始的指令,为事务生成一个全局唯一的事务 id。这个事务 id 在记录 binlog 和 redo log 时都会使用。
  2. 如果缓存池中没有 no=1 所在数据页的数据,从磁盘中找到对应的数据页(注意,这里是一个数据页,不是一条记录),把数据页加载到缓存。
  3. 修改缓存数据页中 no=1 的数据。
  4. 记录数据到 redo log buffer、binlog cache。根据 redo log 刷盘的策略,这个过程中 redo log buffer 可能会被刷新到磁盘。
  5. 服务器收到事务提交的指令。
  6. 刷新 redo log buffer 到磁盘,并标记该事务的状态为 prepare。此操作称为 redo log prepare。
  7. 刷新 binlog cache 到磁盘。
  8. 刷新 redo log buffer 到磁盘,并标记该事务的状态为 commit。此操作称为 redo log commit。
  9. 向客户端返回事务执行的结果。

 七、两段式提交机制:

        主要是redo log文件和bin log文件

第一段:主要是将redo log buffer 中数据写到redo log中

        InnoDB 事务提交前,写入 redo log(prepare 阶段)。当一个事务执行 COMMIT 操作时,InnoDB 首先将修改操作写入 redo log,并将 redo log 标记为 “prepare” 状态,然后刷新到磁盘。

第二段:主要是将bin log cacahe 中数据写到bin log中

        写入 binlog 并将事务标记为提交。MySQL 将事务的 binlog 记录到 binlog cache,并将其刷新到 binlog 文件。之后,InnoDB 将 redo log 从 “prepare” 状态改为 “commit” 状态,表示事务已提交。

bin log 文件是不是会越来越大

        文件可能会越来越大,但它通常不会比存储实际数据的文件大,bin log中存储的是逻辑日志,也就是说,并不保存完整的行数据,而是保存每个操作的 SQL 或修改后的数据的快照。

        binlog 默认会定期轮换生成新的日志文件,旧的 binlog 会保留一段时间(根据 MySQL 配置的 expire_logs_days 设置),这会导致磁盘空间占用增加。

        binlog 有三种日志格式——STATEMENTROWMIXED

        Statement-based(基于语句)

        Row-based(基于行),这种情况下,bin log 文件大小是有可能比数据的大小更加占用空间,更加大

        Mixed-based(混合模式):

MySQL 提供了多种方法来控制 binlog 文件的大小和数量:

自动轮换和清理:即当大小到一定程度后会生成新的文件,而旧文件会有一个过期时间,时间一到就会清理。

手动清理:使用命令 PURGE BINARY LOGS 来手动删除旧的 binlog 文件。

开启 binlog 压缩:8.0版本以后

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

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

相关文章

学术论文排版的常见错误

文档对齐方式:国内的习惯一般是两侧对齐,这也是很多中文论文的排版格式要求。但对于英文论文来说,我来美国后发现的最大的一个差异就是老师发过来的文档都是左对齐,刚开始看着特别别扭,总感觉每行的最右边缺点什么。但…

助力抑郁症初筛!上海交大团队构建Agent心理诊所,论文一作在线展示demo,分享技术亮点

「我有动手打她,甚至好几次掐着她脖子把她按到墙角。每次动完手,我都会后悔,我为什么要动手,我为什么控制不住自己,我是不是就是一个混蛋、一个疯子、一个十恶不赦的人,但我真的不知道该怎么办。」这是 18 …

【优选算法篇】前缀之美,后缀之韵:于数列深处追寻算法的动与静

文章目录 C 前缀和详解:进阶题解与思维分析前言第二章:前缀和进阶应用2.1 和为 k 的子数组(medium)解法一(前缀和 哈希表)示例分析C代码实现易错点提示代码解读 2.2 和可被 K 整除的子数组(med…

HTML基本类型

HTML基本类型 1.结构类型标签 UL ol liUL:是无序列表 type"none" 可以消除前面的黑点OL:是有序列表LI:可以包含流内容,如文本、图片或其他元素。​ 2.文本类型标签 b i s u pp:段落标签 只能放文本b:加粗标签 加粗文本i:斜体标签 文本斜体s:删除线标签 …

「Mac畅玩鸿蒙与硬件14」鸿蒙UI组件篇4 - Toggle 和 Checkbox 组件

在鸿蒙开发中,Toggle 和 Checkbox 是常用的交互组件,分别用于实现开关切换和多项选择。Toggle 提供多种类型以适应不同场景,而 Checkbox 支持自定义样式及事件回调。本篇将详细介绍这两个组件的基本用法,并通过实战展示它们的组合应用。 关键词 Toggle 组件Checkbox 组件开…

Unity计算二维向量夹角余弦值和正弦值的优化方法参考

如果不考虑优化问题,计算两个向量的余弦值或者正弦值可以直接使用类似的方法: [SerializeField] Vector2 v1, v2;void Start() {float valCos Mathf.Acos(Vector2.SignedAngle(v1, v2));float valSin Mathf.Asin(Vector2.SignedAngle(v1, v2)); } 但是…

UEFI学习笔记(十三):Capsule Update

UEFI学习笔记(十三):Capsule Update 一、Capsule update相关概念1、胶囊文件(Capsule File):2、胶囊负载(Capsule Payload):3、交付机制:4、EFI 胶囊更新协议…

编写一个README.md

一、README 在下载github上的代码的时候,通常会有一个README.md文件让你了解该仓库的做了什么,他如何安装等内容。写好README.md是和他人交流的重要环节。 二、README.md的语法逻辑 a、预览模式 在Vscode中编辑README.md的时候可以打开预览模式&#xf…

Android简单控件实现简易计算器

学了一些Android的简单控件,用这些布局和控件,设计并实现一个简单计算器。 计算器的界面分为两大部分,第一部分是上方的计算表达式,既包括用户的按键输入,也包括计算结果 数字;第二部分是下方的各个按键&a…

开源生活-分布式管理

开源竞争(当自己没有办法彻底掌握一门技术的时候就彻底开源掉;培养出更多的依赖,让更多人帮助你完善你的技术,那么这不就是在砸罐子吗?一个行业里面总会有人先砸罐子的,你不如先砸罐子,还能听个…

责任链模式:解耦请求处理的设计模式

1. 引言 在复杂的软件系统中,请求的处理往往需要多个处理者共同参与。如何将这些处理者有效地串联起来,同时又不让请求的发起者直接依赖于具体的处理者,是一个值得关注的问题。责任链模式(Chain of Responsibility Pattern&#…

分布式数据库的发展历程与大规模应用的历史

分布式数据库技术经历了数十年的发展,从最初的理论研究到现今的广泛应用,逐渐成为应对海量数据和高并发需求的重要技术支撑。特别是在近20年里,分布式数据库的技术实现和应用场景不断丰富,已经成为互联网、大数据、云计算等现代产…

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…

Matplotlib可视化——三维图与莫比乌斯带可视化

实验名称 Matplotlib中的三维图绘制:莫比乌斯带的可视化 实验目标 三维的点和线三维轮廓图线框图和曲面图曲面三角形 举例:莫比乌斯带的可视化实验主要使用的Python库 名称版本简介Numpy1.19.5数组运算Matplotlib3.3.4数据可视化实验适用的对象 学习对象:本科学生、研究生…

clickhouse最佳实践(一):clickhouse千亿级日志系统单机到集群架构演进历程

clickhouse千亿级日志系统单机到集群架构演进历程 1. 初始阶段:单机部署2. 使用代理层3. 集群设计4. 数据迁移5. 监控和维护6.集群横向扩展 最佳实践系列文章持续完善中, 记录了业务系统从碰到瓶颈到迭代的过程 1. 初始阶段:单机部署 针对Cl…

ZeroNL2SQL:零样本 NL2SQL

发布于:2024 年 10 月 30 日 星期三 #RAG #NL2SQL # Zero-Shot 自然语言到 SQL(NL2SQL)的转换是一个重要的研究领域,它允许非技术用户轻松访问和分析数据,在商业智能、数据分析等领域具有广泛的应用前景。然而&#x…

前端部署指南:手把手教你部署 Vue 项目

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-部署项目 前言 嗨喽伙伴们大家好,我是依旧青山。作为一名前端开发工程师&#xff…

usb外设枚举不到怎么查

明明内核配置了cdc_acm,dmesg | grep acm也有,lsusb却看不到设备。 排查思路: 主机端: 1、设备树是否使能。 2、主模式和从模式是否配置正确。 设备端: 设备端有条件的话可以插入其它设备看,或者复位…

Vivo开奖了,劝退价。。

vivo 也开奖了,不过有小伙伴反馈是个劝退价,甚至不如隔壁的 oppo,要说这两家也是渊源颇深,一家是绿厂,一家是蓝厂,高管也都是早期步步高出来的。 给大家盘一下开奖的信息,方便大家横向做个对比&…

Python 的 Pygame 库来开发一个游戏

import pygame import random# 初始化 Pygame pygame.init()# 设置屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height))# 设置标题 pygame.display.set_caption("飞机大战")# 加载图片 player_img pyga…