[MySql]两阶段提交

文章目录

  • 什么是binlog
    • 使用binlog进行恢复的流程
  • 什么是redolog
    • 缓冲池
    • redolog
    • redolog结构
  • 两阶段提交

什么是binlog

binlog是二进制格式的文件,用于记录用户对数据库的修改,可以作用于主从复制过程中数据同步以及基于时间点的恢复(PITR)。
一般我们会将binlog用于以下几个方面:

  • 数据库增量备份与恢复:在使用备份还原数据后,可以使用 binlog 中记录的内容对备份时间点(简称备份点)后的数据进行恢复。因为 binlog 会还会记录下更改操作的时间,所以 binlog 可以恢复到某一具体时间点的数据。这就为我们删库后提供了除跑路以外的第二个选项:使用 binlog 恢复数据。
  • 主从复制:MySQL 从服务器可以通过订阅 binlog 实现对主服务器的增量复制。
  • 通过对 binlog 中的数据进行审计,判断是否存在安全问题,比如 SQL 注入。

记录的内容包括:写操作语句(增删改)、表结构更改(create table、alter table、drop table)、数据的
开始和提交(begin和commit操作)

使用binlog进行恢复的流程

  1. 先通过最新的备份恢复数据库的数据,并记录下备份文件备份的时间点。
  2. 在 binlog 中找到这个时间点,提取这个时间点以后的数据用于实现对备份点后数据的恢复(这个特性被称为 Point in Time,简称 PIT)。

什么是redolog

缓冲池

首先要明确一个缓冲池的概念,在读取数据的时候,首先会把数据放到缓冲中,下次在读取的额时候会先去缓冲池中获取(减少磁盘IO,提高性能),如果没有的话,在往数据库中查询。在修改数据的时候如果缓冲池中不存在所需要的数据页,就从磁盘读取,否则就在缓冲池中把数据页进行修改。

这里会有一个问题,在缓冲池中修改了数据页,和磁盘上的数据会造成短暂的不一致的情况,这个情况叫做脏页,把不一致的内容刷新的磁盘这个操作叫做刷脏页

什么时候刷脏页:

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

redolog

上文中提到数据如果在缓冲池中被修改,会有短暂的时间和数据库中不一致,造成脏数据,那么当缓冲池中的数据被修改之后,这个时候服务器出现宕机,就可能会造成数据的丢失,那么这个时候可以使用WAL(write-Ahead Logging)日志先行,也就是事务提交前先写入日志,在修改页,这里的日志指的就是redolog

redolog结构xx表空间,xx页,xx位置,xx值

由于 redo log 是顺序写(顺序 IO),因此能有效提升 IO 效率;又因为每次事务提交前会先写 redo log,因此可以保障更新的数据不丢失。

一旦脏页刷新,磁盘上对应的 redo log 就会失效,所以 redo log 用完后,可以再回头使用,这样更节省空间。直到需要刷 redo log buffer 时发现接下来的 redo log 对应的脏页未被刷新,此时会强制刷新脏页。缓冲池的好处我们前面已经讲过,所以 redo log 弄了个类似作用的 redo log buffer。在写 redo log 时会先写 redo log buffer,并在以下时机将 redo log 刷新到磁盘

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

redolog结构

如果脏页没刷完,数据库宕机了,那么必然是需要使用 redo log 来恢复数据的。那么 redo log 应该从哪开始恢复数据呢?为解决这个问题 InnoDB 为 redo log 记录了序列号,这被称为 LSN(Log Sequence Number),可以理解为偏移量,越新的日志 LSN 越大。InnoDB 用检查点(checkpoint_lsn)指示未被刷脏页的 redo log 数据从这里开始,用 lsn 指示下一个应该被写入日志的位置。不过由于有 redo log buffer 的缘故,实际被写入磁盘的位置往往比 lsn 要小。
在这里插入图片描述

两阶段提交

为什么要两阶段提交呢?直接提交不行吗?

我们可以假设不采用两阶段提交的方式,而是采用“单阶段”进行提交,即要么先写入 redo log,后写入 binlog;要么先写入 binlog,后写入 redo log。这两种方式的提交都会导致原先数据库的状态和被恢复后的数据库的状态不一致。

先写入 redo log,后写入 binlog:

在写完 redo log 之后,数据此时具有crash-safe能力,因此系统崩溃,数据会恢复成事务开始之前的状态。但是,若在 redo log 写完时候,binlog 写入之前,系统发生了宕机。此时 binlog 没有对上面的更新语句进行保存,导致当使用 binlog 进行数据库的备份或者恢复时,就少了上述的更新语句。从而使得id=2这一行的数据没有被更新。
在这里插入图片描述
先写入 binlog,后写入 redo log:

写完 binlog 之后,所有的语句都被保存,所以通过 binlog 复制或恢复出来的数据库中 id=2 这一行的数据会被更新为 a=1。但是如果在 redo log 写入之前,系统崩溃,那么 redo log 中记录的这个事务会无效,导致实际数据库中id=2这一行的数据并没有更新。

在这里插入图片描述
简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致

总体来说:
更新语句的执行是 Server 层和引擎层配合完成,数据除了要写入表中,还要记录相应的日志。

执行器先找引擎获取 ID=2 这一行。ID 是主键,存储引擎检索数据,找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。
从上图可以看出,MySQL 在执行更新语句的时候,在服务层进行语句的解析和执行,在引擎层进行数据的提取和存储;同时在服务层对 binlog 进行写入,在 InnoDB 内进行 redo log 的写入。

不仅如此,在对 redo log 写入时有两个阶段的提交,一是 binlog 写入之前prepare状态的写入,二是 binlog 写入之后commit状态的写入。
在这里插入图片描述

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

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

相关文章

Webpack: 借助 Babel+TS+ESLint 构建现代 JS 工程环境

概述 Webpack 场景下处理 JavaScript 的三种常用工具:Babel、TypeScript、ESLint 的历史背景、功能以及接入 Webpack 的步骤借助这些工具,我们能构建出更健壮、优雅的 JavaScript 应用 使用 Babel ECMAScript 6.0(简称 ES6) 版本补充了大量提升 JavaSc…

互联网应用主流框架整合之Spring Boot运维体系

先准备个简单的系统,配置和代码如下 # 服务器配置 server:# 服务器端口port: 8001# Spring Boot 配置 spring:# MVC 配置mvc:# Servlet 配置servlet:# Servlet 的访问路径path: /sbd# 应用程序配置application:# 应用程序名称name: SpringBootDeployment# 配置数据…

第 133 场 LeetCode 双周赛题解

A 使所有元素都可以被 3 整除的最少操作数 遍历 n u m s nums nums &#xff0c;每有一个不被 3 3 3 整除的数&#xff0c;则操作数加 1 1 1 class Solution {public:int minimumOperations(vector<int>& nums) {int res 0;for (auto x : nums)if (x % 3 ! 0)res…

杂记 | 搭建反向代理防止OpenAI API被封禁(对于此次收到邮件提示7月9日后将被屏蔽的解决参考)

文章目录 重要声明&#xff08;免责&#xff09;01 OpenAI封禁API的情况02 解决方案及原理2.1 原因分析2.2 解决方案2.3 步骤概述 03 操作步骤3.1 购买一个海外服务器3.2 申请一个域名3.3 将域名指向代理服务器3.4 在代理服务器上安装nginx3.5 配置反向代理 重要声明&#xff0…

接口自动化测试

接口自动化测试 为什么要做自动化测试&#xff1f;如何做自动化测试测试工具 本文只讲方法&#xff0c;不会太多关注具体实用细节。 为什么要做自动化测试&#xff1f; 当接口的功能很复杂、很灵活、频繁变更时&#xff0c;代码稍微有些变更&#xff0c;影响范围很难短时间内…

网工内推 | 深圳网工,国企,最高20k,六险一金,NA以上认证

01 沛顿科技&#xff08;深圳&#xff09;有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1、负责网络设备管理及维护&#xff0c;确保网络系统的稳定运行&#xff1b; 2、负责有效规划及实施网络布线系统&#xff1b; 3、负责服务…

打造你的跨境电商平台:从pandabuy的成功看如何开发淘宝代购集运系统

在当今全球化的电商浪潮中&#xff0c;跨境购物已成为一种趋势。pandabuy作为一个成功的跨境独立站&#xff0c;其淘宝代购集运系统凭借高效的服务和优质的用户体验广受欢迎。对于希望建立类似平台的创业者来说&#xff0c;深入分析pandabuy的成功经验&#xff0c;并运用于自身…

LV、古驰奢侈品跌落神坛!2024消费风向彻底变天!2024创业新风口!2024创业小成本项目!

LV下滑6%、古驰暴跌28%&#xff0c;奢侈品在华越来越卖不动&#xff0c;外媒开始着急了&#xff01;就在前段时间&#xff0c;美媒罕见发声&#xff0c;表示今年1季度特别困难&#xff0c;有奢侈品公司在华负增长高达30%。还说如何提升销量&#xff0c;是当下奢侈品牌在华的头等…

使用matlab开发stm32总结,stm32-matlab常见的问题处理以及报错合集

1&#xff0c; 问题&#xff1a;本来是好的&#xff0c;突然编译运行报错&#xff0c;说是确少包&#xff0c; 解决方案&#xff1a;重启以后好了 2&#xff0c;有完美的马鞍波&#xff0c;为什么不能够转动呢&#xff1f; 原因是我这里模型的问题&#xff0c;我计算出来的是占…

前端请求XMLHttpRequest详解

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 javascript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 这篇文章…

全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动顺利开展

6月21日&#xff0c;省教育评估院在四川邮电职业技术学院组织开展全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动。省教育评估院副院长赖长春&#xff0c;四川邮电职业技术学院党委副书记、校长冯远洪&#xff0c;四川邮电职业技术学院党委委员、副校长程德杰等出席…

业务场景问题二:部分业务场景问题(简)

在面试环节&#xff0c;通常面试官会问一些企业级开发项目中的场景问题&#xff0c;大致可分为以下几个部分&#xff0c;本章作为简易引导&#xff0c;不作详细的技术解答。 面试的业务场景问题 处理亿级数据库&#xff1a; 数据库分库分表&#xff1a;使用分片技术将数据按照…

Docker环境安装anythingllm

拉镜像 docker pull mintplexlabs/anythingllm建目录 export STORAGE_LOCATION$HOME/anythingllm && \ mkdir -p $STORAGE_LOCATION && \ touch "$STORAGE_LOCATION/.env"检查目录具有写权限 # 为目录anythingllm赋写权限 chmod 777 anythingllm 启…

探索Scala的尾递归优化:性能提升的秘诀

探索Scala的尾递归优化&#xff1a;性能提升的秘诀 引言 在函数式编程中&#xff0c;递归是一种常见的编程范式。然而&#xff0c;传统的递归可能会因为堆栈溢出而导致性能问题。Scala作为一门支持函数式编程的语言&#xff0c;提供了尾递归优化的特性&#xff0c;这使得递归…

PCL笔记二 之VS环境配置(不同版本Debug+Release编译)

PCL笔记二 之VS环境配置(不同版本Debug+Release编译) PCL官网:https://github.com/PointCloudLibrary/pcl/releases众所周知,PCL是一个用于点云处理并且依赖不少三方库的一个算法库,同时在编译配置环境时也很复杂,因此这里想整理一下不同版本对应的环境配置过程,版本如下…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数&#xff1b; 2.遍历字符串&#xff1a; 2.1.若当为左括号&#xff0c;则need&#xff0c;表示…

eslint版本9.0之后配置方法

在eslint9.0之后&#xff0c;迎来版本大更新。首先是抛弃了自带的规则&#xff08;没了我喜欢的git standard风格&#xff09;&#xff0c;其次是配置又更新了&#xff0c;改动有点大&#xff0c;重新捋了一遍之后&#xff0c;附上最新的eslint配置过程。 初始化命令 此次试验…

[word] 如何在word中插入地图? #学习方法#其他

如何在word中插入地图&#xff1f; 人事部门在给即将入职的新员工发送入职资料时&#xff0c;为了方便新员工能快速找到公司的具体位置&#xff0c;一般都会在word资料中插入公司所在位置的地图。今天&#xff0c;小编就分享一个在word中插入地图的方法。 第一步&#xff1a;…

企智汇软件:专业项目管理系统,一体化PaaS平台!快速落地项目!

在快速变化的市场环境中&#xff0c;项目管理不再是简单的任务分配和时间跟踪&#xff0c;它更是一门需要精准决策、高效沟通和智能协作的管理工具。然而&#xff0c;面对日益复杂的项目需求、跨部门的协作挑战以及海量的信息数据&#xff0c;传统的项目管理方式往往显得力不从…

HTML/CSS 基础

1、<input type"checkbox" checked> checked 默认选中为复选框 2、表格中的标题<caption> 3、文字标签直接加 title 4、<dl>为自定义列表的整体&#xff0c;包裹<dt><dd> <dt>自定义列表的主题 <dd>主题的每一项内容 5、…