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.xdnf.cn/news/1902.html

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

相关文章

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…

openGauss开源数据库实战十四

文章目录 任务十四 openGauss 逻辑结构:视图管理任务目标实施步骤一、准备工作二、为什么需要视图1.通过视图对用户隐藏信息2.创建一个比逻辑模型更符合用户直觉的表 三、创建视图时指定视图的属性名四、基于视图建立新的视图五、物化视图六、视图失效(openGauss暂不支持)七、通…

DICOM标准:US超声模块属性详解——超声医学的DICOM标准解析

引言 数字成像和通信在医学领域中的应用极为广泛,其中DICOM(数字成像和通信医学)标准对于确保不同设备和系统之间的兼容性和互操作性至关重要。本文将详细介绍DICOM标准中关于超声医学(Ultrasound, US)的部分&#xff…

分布式光伏管理办法

随着分布式光伏项目的不断增加,传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具,正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…

录屏+直播神器 OBS Studio 30.2.3

这款很多游戏博主都在用的录制神器,平时你看到的抖音平台上的游戏主播,大部分都用的这款直播录屏软件。同时它可以虚拟直播(绿幕虚拟背景)具体可以百度或哔哩哔哩上有详细教程 软件优点 高性能实时视频/音频捕获和混合。创建由多个…

企业应该采用和支持网络安全的几个实践

令人惊讶的是,网络安全可以像遵循最佳实践一样简单,理想情况下应该将其融入企业文化本身。在这篇文章中了解更多。 网络安全的重要性 在当今的网络安全期望中,软件工程师应该优先考虑他们的计算机系统和内部IT网络的安全性。我认为严重依赖…

ConnectX-7 25/50/100/200/400G NIC

ConnectX-7 25/50/100/200/400G NIC ConnectX-7提供了广泛的软件定义、硬件加速的网络、存储和安全功能,使组织能够现代化和保护他们的IT基础设施。此外,ConnectX-7还支持从边缘到核心数据中心到云的敏捷和高性能解决方案,同时增强网络安全性…

(代码随想录)BEllman_ford算法 及其优化 SPFA

代码随想录 (知识提炼) Bellman_ford算法 用处 解决带负权值的单源最短路问题 核心思想 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路。 何为松弛 minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可…

代码随想录算法训练营第十六天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接:. - 力扣(LeetCode) 文章讲解:代码随想录 视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩…

大数据分析案例-基于随机森林算法的智能手机价格预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

mtr mysql-test-run.pl — Run MySQL Test Suite

The mysql-test-run.pl Perl script is the main application used to run the MySQL test suite. pl Perl脚本是用来运行MySQL测试套件的主要应用程序。 It invokes mysqltest to run individual test cases. 它调用mysqltest来运行单独的测试用例。 Invoke mysql-test-run.pl…

华为云计算知识总结——及案例分享

目录 一、华为云计算基础知识二、华为云计算相关案例实战案例一:搭建弹性云服务器(ECS)并部署Web应用案例二:构建基于OBS的图片存储和分发系统案例三:基于RDS的高可用数据库应用案例四:使用华为云DDoS防护保…

计算合约方法的签名

计算合约方法的签名 通过智能合约实现 // SPDX-License-Identifier: MIT pragma solidity ^0.8.26;contract FunctionSelector {/*"transfer(address,uint256)"0xa9059cbb"transferFrom(address,address,uint256)"0x23b872dd*/function getSelector(stri…

Ant-Dseign-Pro如何去国际化及删除oneapi.json后出现程序直接结束问题的解决方案

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 移除国际化 什么是国际化 在AntDesignPro当中,国际化就是如果你初始默认使用中文,想要切换英文,我们可以切换到英文模式。同时&#x…

太速科技-9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡

基于DSP TMS320C6678FPGA XC7V690T的6U VPX信号处理卡 一、概述 本板卡基于标准6U VPX 架构,为通用高性能信号处理平台,系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器&#…

Mysql当中的各种log

一、MySQL日志文件类型 重做日志(redo log)回滚日志(undo log)二进制日志(binlog)错误日志(errorlog)慢查询日志(slow query log)一般查询日志(g…

自定义规则配置教程

大家在使用waf的时候,因为业务特殊性和waf的严格校验,有时会产生误报,阻拦合法流量。 这个时候,只能通过自定义规则进行补充,选择加白名单或者黑名单。 很多人会说配置黑白名单失效了,其实95%以上都是自己…

Java项目:图书管理系统(有源代码)

Java项目:图书管理系统(有源代码) 直接上项目实现效果,文末有源码获取方式 一、技术选型 • Spring Boot、Vue、MySQL、Redis 二、功能说明 用户功能 图书查询功能 读者规则功能 查看公告 个人信息 借阅信息 违章信息 读者留言…

鸿蒙生态崛起:开发者机遇、挑战与未来展望

背景 鸿蒙系统不断发展,有与安卓、iOS 形成三足鼎立之势,且其在智能手机、智能穿戴、车载、家居等行业领域的应用越来越广泛。作为开发者,如何抓住鸿蒙生态崛起的机遇,解决开发挑战,创造更好的应用体验?欢…

MYSQL复合查询

当我们要查询的数据要使用的限制条件不是很简单的时候,可能要在一个限制条件下再次限制,比如要查找小美所在公司的平均薪资,就要先找到小美的公司,再求平均薪资。复合查询分三种,多表连接查询、子句查询和合并查询。 …