mysql中redolog、binlog

我们中说删库跑路,那么数据库删除后,里面的数据怎么恢复呢?

这里就涉及到了redolog和binlog了

一、什么是存储引擎和缓冲池

存储引擎是 MySQL 中直接与磁盘交互部分。也是存储引擎读写数据的最小单位,一个页里可以有一条或多条表记录。MySQL 中的存储引擎有很多种,比如 InnoDB、MyISAM、Memory 等。其中最常用的是 InnoDB。而 InnoDB 是 MySQL 中唯一能够完整支持事务特性的存储引擎,也是一个高性能的存储引擎。「两段式提交」就发生在 InnoDB 中。

缓冲池

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

mysql就是一个基于磁盘的数据库,关系型数据库的特点就是需要对磁盘中大量的数据进行存取,所以有时候也被叫做基于磁盘的数据库。正是因为数据库需要频繁对磁盘进行 IO 操作,为了改善因为直接读写磁盘导致的 IO 性能问题,所以引入了缓冲池。mysql每次查询时是按页进行查询的,每个页中会有大量的数据,将这些数据加载到内存中的缓冲池中,下次再进行查找的时候,会先去内存中进行查找,若找不到才会去磁盘中读取。这种方式是很好的,但是会出现缓冲池污染和预读失效的问题

二、刷脏页

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

刷脏页的时机:

  1. 每 10 秒必刷新一次

  2. 脏页太多时(默认占比超过 innodb_max_dirty_pages_pct 配置的值时刷新)

  3. redo log 空间不足时

  4. 数据库关闭时

三、什么是binlog

binlog 是 MySQL 服务器层面实现的一种二进制日志,用于记录所有对数据库的增删改操作(这种日志被称为逻辑日志)。比如你 update 一条记录,服务器就会记录一条对应的信息到 binlog。但在 InnoDB 中,这个 binlog 是以事务为单位刷新到磁盘的。基于 binlog 的这种特性,一般我们会将 binlog 用于以下几个方面:

  1. 数据库增量备份与恢复:在使用备份还原数据后,可以使用 binlog 中记录的内容对备份时间点(简称备份点)后的数据进行恢复。因为 binlog 会还会记录下更改操作的时间,所以 binlog 可以恢复到某一具体时间点的数据。但是不可避免的还是会造成数据丢失(如果被删库跑路的话)

  2. 主从复制:MySQL 从服务器可以通过订阅 binlog 实现对主服务器的增量复制。

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

binlog 进行恢复的流程

  1. 先通过最新的备份恢复数据库的数据,并记录下备份文件备份的时间点。

  2. 在 binlog 中找到这个时间点,提取这个时间点以后的数据用于实现对备份点后数据的恢复(这个特性被称为 Point in Time,简称 PIT)。

各个部分之间的关系

什么是随机 IO 和顺序 IO?

磁盘读写数据的两种方式。随机 IO 需要先找到地址,再读写数据,每次拿到的地址都是随机的。就像送外卖,每一单送的地址都不一样,到处跑,效率极低。而顺序 IO,由于地址是连贯的,找到地址后,一次可以读写许多数据,效率比较高。就像送外卖,所有的单子地址都在一栋楼,一下可以送很多,效率很高。

四、什么是redo log

前面我们讲到数据页在缓冲池中被修改会变成脏页。如果这时宕机,脏页就会失效,这就导致我们修改的数据丢失了,也就无法保证事务的持久性。保证数据不丢,就是 redo log 的一个重要功能。

如果我们修改了缓冲池中的数据页就立刻刷脏页,会产生大量随机 IO,导致磁盘性能变差;但如果我们先写缓冲,一段时间后再刷脏页,就有可能造成数据丢失,无法保证事务的持久性。

WAL(Write-Ahead Logging,日志先行)。即:事务提交前先写日志,再修改页(修改页的时机就是刷脏页的时机)。这里所谓的日志,就是 redo log。

然后一旦脏页刷新,那么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 中的记录刷新到磁盘

  1. 每秒刷新一次

  2. 事务提交时

  3. redo log buffer 剩余空间小于 1/2 时

为什么redolog就能保证数据不丢失呢:

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

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

InnoDB 为 redo log 记录了序列号,这被称为 LSN(Log Sequence Number),可以理解为偏移量,越新的日志 LSN 越大。InnoDB 用检查点(checkpoint_lsn)指示未被刷脏页的 redo log 数据从这里开始,用 lsn 指示下一个应该被写入日志的位置。不过由于有 redo log buffer 的缘故,实际被写入磁盘的位置往往比 lsn 要小。

有 binlog 为什么还要 redo log

  1. binlog 不知道数据库究竟是在哪一时刻丢失了哪部分数据,只能从备份点开始对 binlog 记录重放来恢复数据,比较耗时。

  2. binlog 恢复是需要我们手动执行的,而 redo log 可以在服务器重启后自动恢复数据。

  3. WAL + 先写缓冲 + 异步刷脏页有效提升了磁盘的 IO 效率。

有 redo log 为什么还要 binlog

  1. binlog 是服务器层面的功能,redo log 是 innoDB 的功能。redo log 帮助 InnoDB 实现了性能提升、自动恢复。但其他存储引擎是无法使用 redo log 的能力的。

  2. 我们也可以关闭 binlog,但大多数情况下我们都会开启,因为开启的好处更多。比如,主从模式需要订阅 binlog 进行主从复制,以及可以通过 binlog 进行数据库的增量备份和恢复。

redo log 有很多好处,所以我们不能放弃;binlog 也有很多好处,我们也不能放弃。也就是说,这两个功能我们都需要开启。既然都要开启,那么我们必须保证 redo log 和 binlog 数据的一致性。

六、执行updata中 InnoDB内部的流程

当我们执行如下 update 语句时,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. 向客户端返回事务执行的结果。

参考文章:

https://zhuanlan.zhihu.com/p/552706911

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

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

相关文章

【分布式技术】分布式事务深入理解

文章目录 概述产生原因关键点 分布式事务解决方案3PC3PC的三个阶段:3PC相比于2PC的改进:3PC的缺点: TCCTCC事务的三个阶段:TCC事务的设计原则:TCC事务的适用场景:TCC事务的优缺点:如何解决TCC模…

字节青训-找出最长的神奇数列

问题描述 小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一…

华为配置BFD状态与接口状态联动实验

组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响,提高网络的可靠性,网络设备需要能够尽快检测到与相邻设备间的通信故障,以便及时采取措施&…

解压缩工具详解:ZArchive对比解压专家

ZArchiver 和解压专家在手机版解压缩工具市场中都占据着重要地位,深受用户喜爱。 ZArchiver 是一款功能强大的解压缩文件应用程序。它支持创建多种格式的压缩文件,如 7z (7zip)、zip、bzip2 (bz2)、gzip (gz)、XZ、tar 等;同时支持解压众多格…

CPU算法分析LiteAIServer视频智能分析平台噪声检测功能在视频监控中的应用与优势

在视频监控系统中,噪声问题一直是影响视频画面清晰度和可用性的关键因素。这些噪声可能源于多种因素,如低光环境、摄像机传感器的高灵敏度或编码压缩过程中的失真等。为了应对这些挑战,CPU算法分析LiteAIServer引入了噪声检测功能&#xff0c…

MATLAB实现蝙蝠算法(BA)

MATLAB实现蝙蝠算法(BA) 1.算法介绍 蝙蝠算法(简称BA)是一种受微型蝙蝠回声定位机制启发的群体智能算法,由Xin-She Yang于2010年提出。这种算法模拟了微型蝙蝠通过向周围环境发出声音并监听回声来识别猎物、避开障碍物以及追踪巢穴的行为。…

git push到远程怎么回退

git push到远程服务器想继续修改,你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令,回退很简单。 按照下面的流程操作就行: 1.查看提交历史 首先,使用git log命令查看提交历史。可以使用以下命令显…

邮件系统SSL加密传输,保护你的电子邮件免受网络威胁

在互联网的浪潮中,企业数字化转型的步伐不断加快。企业邮箱作为数字化应用的重要组成部分,已成为员工沟通、协同工作和企业管理的关键工具。但是在公共网络安全性普遍较弱的背景下,黑客容易侵入企业网络,监控流量,截获…

跨平台开发支付组件,实现支付宝支付

效果图: custom-payment : 在生成预付订单之后页面中需要弹出一个弹层,弹层中展示的内容为支付方式(渠道),由用户选择一种支付方式进行支付。 该弹层组件是以扩展组件 uni-popup 为核心的,关于…

usb学习笔记

1 学习链接 https://zhuanlan.zhihu.com/p/683251257https://zhuanlan.zhihu.com/p/683251257控制传输固定使用端点0 ,枚举过程使用大量的控制传输,可参考后文中枚举过程的实际报文。控制传输为了保证配置数据的传输的有效性,使用了指令再确…

uniapp一键打包

1.先安装python环境, 2.复制这几个文件到uniapp项目里面 3.修改自己证书路径,配置文件路径什么的 4.在文件夹页面双击buildController.py或者cmd直接输入buildController.py 5.python报错,哪个依赖缺少安装哪个依赖 6.执行不动的话&…

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 爬取的UP主信息 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视…

图文并茂教你如何发布自己的NPM包(GitHub Packages npm 包发布)

前情提要 发布包到npm也好,到github packages仓库也好,都是一样的道理,只是仓库地址不一样而已,本文是将npm包发布到了GitHub Packages~ GitHub Packages 简介 GitHub Packages 是一种软件包托管服务,和npm类似&…

WPS设置下拉选项,下拉菜单如何添加

在物料参数工作表输入内容 然后选中要设置下拉选项的单元格 点击数据-》下拉列表 然后选中物料参数的A列就行了

小程序弹窗滑动穿透问题

<!-- page-meta 只能是页面内的第一个节点 --> <page-meta page-style"{{ show ? overflow: hidden; : }}" />

无人机避障——2D栅格地图pgm格式文件路径规划代码详解

代码和测试效果请看上一篇博客&#xff1a; 无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划-CSDN博客 更换模型文件.dae&#xff1a; 部分模型文件可以从这里下载&#xff1a; https://github.com/ethz-asl/rotors_simulator/wiki 将原先代码中的car.dae文件…

iPhone当U盘使用的方法 - iTunes共享文件夹无法复制到电脑怎么办 - 如何100%写入读出

效果图 从iPhone复制文件夹到windows电脑 步骤windows 打开iTunes通过USB连接iPhone和电脑手机允许授权iTunes中点击手机图标&#xff0c;进入到点击左边“文件共享”&#xff0c;在右边随便选择一个App&#xff08;随意...&#xff09;写入U盘&#xff1a;拖动电脑的文件&am…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

【保姆级教程】Linux服务器本地部署Trilium+Notes笔记结合内网穿透远程在线协作

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes的中文版如何在Linux环境使用docker本地部署…

整合 flatten-maven-plugin 插件:解决子模块单独打包失败问题

整合 flatten-maven-plugin 插件&#xff1a;解决子模块单独打包失败问题 解决问题 我们来解决 Maven 多模块工程中&#xff0c;如果在父 pom 中定义了统一版本号 revision &#xff0c;单独对某个子模块执行 clean package 打包失败的问题。 [ERROR] Failed to execute goa…