MySQL 预写日志

这篇具有很好参考价值的文章主要介绍了MySQL 预写日志。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是预写日志机制?

一般情况下,大部分数据库都是将表和索引存储在磁盘文件中。当新增数据时,数据库系统会先写入内存,然后将其写入磁盘上的数据文件。

那为什么不直接写入磁盘嘞?主要是每次新增都直接写入磁盘性能很低,放在内存中,可以批量写入磁盘以提升性能。

但有一个问题,如果数据在写入磁盘文件中途断电怎么办?当来电恢复后,我们重启数据库,发现数据不一致,又该如何处理。

所以我们需要一些其他机制来避免断电引发的数据不一致,其实 MySQL 已经考虑到了这一点,内部已经实现一套 WAL(预写日志)机制来避免这一点。

MySQL 设计有健壮的恢复机制,特别是使用 InnoDB 存储引擎的情况下,它能够在断电后重启而不会崩溃。InnoDB 存储引擎使用预写日志(WAL)机制来确保数据的一致性和原子性。

预写日志机制是一种数据库事务日志技术,它要求在任何数据库修改被写入到永久存储(也就是磁盘)之前,先将这些修改记录到日志中。

这样当 MySQL 遇到意外的断电情况时,它会在重启后利用 Redo log 来恢复已提交但未写入数据文件的事务继续写入数据文件,从而保证一致性,再利用 undo log 来撤销未提交事务的需改,从而保证原子性。

MySQL 中的预写日志机制

MySQL 预写日志,mysql,adb,数据库

在 MySQL 中,InnoDB 存储引擎实现了 WAL 机制。包含 Redo log buffer、Redo log、Undo Log 等,来记录事务已提交但未写入数据文件的数据变更以及事务回滚后的数据还原。

为了给大家讲清楚 MySQL 的预写日志机制,会涉及到 MySQL 架构中的以下内容,

Buffer Pool(缓冲池)

Buffer Pool (缓冲池)是 InnoDB 存储引擎中非常重要的内存结构,顾名思义,缓冲池就是起到一个缓存的作用,因为我们都知道 MySQL 的数据最终是存储在磁盘中的,如果没有这个 Buffer Pool 那么我们每次的数据库请求都会磁盘中查找,这样必然会存在 IO 操作,这肯定是无法接受的。

但是有了 Buffer Pool 就是我们第一次在查询的时候会将查询的结果存到 Buffer Pool 中,这样后面再有请求的时候就会先从缓冲池中去查询,如果没有再去磁盘中查找,然后在放到 Buffer Pool 中。

Redo log buffer(日志缓冲区)

Redo log buffer 是用作数据变更记录写入 Redo log 文件前的一块内存区域。日志缓冲区大小由 innodb_log_buffer_size 变量定义,默认大小为 16MB。

日志缓冲区的内容会定期刷新到 Redo log 文件中,大型日志缓冲区允许大型事务运行,而无需在事务提交之前将 Redo log 数据写入磁盘。因此如果事务涉及的更新、插入或删除操作数据量较大时,可以增加日志缓冲区的大小可以节省磁盘 I/O。

MySQL 提交事务的时候,会将 Redo log buffer 中的数据写入到 Redo log 文件中,刷磁盘可以通过 innodb_flush_log_at_trx_commit 参数来设置

  • 值为 0 表示不刷入磁盘
  • 值为 1 表示立即刷入磁盘
  • 值为 2 表示先刷到 os cache

为了提高性能,MySQL 首先将修改操作写入到日志缓冲区,之后以 innodb_flush_log_at_trx_commit 参数设置落盘时机,将日志缓冲区刷入到磁盘的 Redo log 文件中去。

Redo Log

MySQL Redo Log 是 InnoDB 存储引擎中的一个重要组件,它是一种磁盘基础的数据结构,用于在崩溃重启期间修复由已提交事务但未写入数据文件的数据。

在正常操作中,Redo log 记录了由 SQL 语句执行导致的表数据变更记录。将 Redo log buffer 中的数据持久化到磁盘中,就是将 Redo log buffer 中的数据写入到 Redo log 磁盘文件中。

数据在由 Redo log buffer 写入 Redo log 时的触发时机如下,

  • MySQL 正常关闭时触发
  • 当 Redo log buffer 中记录的写入量大于 Redo log buffer 内存空间的一半时,会触发落盘
  • InnoDB 的后台线程每隔 1 秒,将 Redo log buffer 持久化到磁盘
  • 每次事务提交时都将缓存在 redo log buffer 里的 redo log 直接持久化到磁盘(这个策略就是由上文提高 innodb_flush_log_at_trx_commit 参数控制)

Redo log 是 WAL 机制的核心,它记录了事务所做的所有修改。如果数据库发生故障,可以使用 Redo 日志来重做事务,从而确保数据的一致性。

Undo Log

Undo Log 记录了如何撤销一个事务的修改。如果需要回滚事务或在执行事务时还未提交,数据库就发生了崩溃,这时我们就需要将未提交事务前的数据回滚回去,难道这个操作有我们自己来做吗?显然 MySQL 也考虑到了这一点。

MySQL 会使用 Undo log 来撤销未提交的修改。在操作数据前,MySQL 首先将数据备份到 Undo log,然后进行数据修改。

如果出现错误或者用户执行了 Rollback 语句,系统可以利用 Undo log 中的备份将数据恢复到事务操作前的状态。

通过 Undo log 撤销修改,从而确保数据的原子性。


结合 Buffer Pool、Redo log buffer、Redo log、Undo log 后,我们在MySQL 中更新一条数据的流程如下,

MySQL 预写日志,mysql,adb,数据库

  • 准备更新一条 SQL 语句
  • MySQL(innodb)会先去缓冲池(Buffer Pool)中去查找这条数据,没找到就会去磁盘中查找,如果查找到就会将这条数据加载到缓冲池(Buffer Pool)中
  • 在加载到 Buffer Pool 的同时,会将这条数据的原始记录保存到 undo 日志文件中
  • innodb 会在 Buffer Pool 中执行更新操作
  • 更新后的数据会记录在 Redo log buffer 中
  • MySQL 提交事务的时候,会将 Redo log buffer 中的数据写入到 Redo log 文件中,刷磁盘可以通过 innodb_flush_log_at_trx_commit 参数来设置
  • MySQL 重启的时候会将 Redo log 恢复到缓冲池中

额外知识:检查点(Checkpoint)

检查点是什么?为什么有了 Redo log、Undo log 还要引入检查点。

明明借助 Redo log、Undo log 我们就可以实现 MySQL 的故障恢复了。

虽然数据在写入 Redo log 文件后,就代表数据变更已经生效了,但是还未写入到数据文件,也就是还没有完成事务的持久性。

那么检查点就是帮助 MySQL 实现事务的持久性。

如果说 Redo log 可以无限地增大,能够保存所有数据库变更的数据,那么在发生宕机时完全可以通过 Redo log 来恢复数据库系统的数据到宕机发生前的情况。

然而现实是我们的物理磁盘文件大小是有效的。即使达成无限了,如果数据库运行了很久后发生宕机,那么使用 Redo log 进行恢复的时间也会非常的久。

所以在 Redo log 文件容量是有限的情况下,还需要定期将 Redo log 写入数据文件完成数据的持久化,在这样的情况下,就引入了 Checkpoint(检查点)技术。

Checkpoint(检查点)技术不仅仅是会同步 Redo log 写入数据文件,也会同步脏页数据写入数据文件。

检查点的触发时机有两种如下,

Sharp Checkpoint(完全检查点)

将内存中所有脏页全部写到磁盘就是完全检查点,比如数据库实例关闭时。

Fuzzy Checkpoint(模糊检查点)

将部分脏页刷新到磁盘,就是模糊检查点,一般就是脏页达到一定数量时触发。数据库实例运行过程产生的检查基本上就是这种类型的检查点。

因此其实 Checkpoint 就是指一个触发点(时间点),当发生 Checkpoint 时,会将脏页写回磁盘,以确保数据的持久性和一致性。并且 Redo log、Undo log 文件也可以重新覆写,这样可以保证重启时不会因为 Redo log、Undo log 文件太大而导致重启时间过长。

断电故障恢复案例

OK,假如我们正在使用 MySQL 添加数据。在提交事务的过程中,突然发生了断电,那么这个数据会丢吗?

我们结合上文MySQL 中更新一条数据的流程,来给大家分析下具体场景,

数据在写入 Buffer Pool、Redo log buffer 中时,发生断电

先说结论,会丢。因为数据没有写入 Redo log 前,MySQL 是没办法保证数据一致性的。但是这没关系的,因为 MySQL 会认为本次事务是失败的,在重启后可以根据 Undo log 文件将数据恢复到更新前的样子,并不会有任何的影响。

数据在写入 Redo log 文件后,发生断电

先说结论,不会丢。因为 Redo log buffer 中的数据已经被写入到 Redo log 了,就算数据库宕机了,在下次重启的时候 MySQL 也会将 Redo log 文件内容恢复到 Buffer Pool 中进行重放。文章来源地址https://www.toymoban.com/news/detail-759324.html

到了这里,关于MySQL 预写日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生数据仓库AnalyticDB Mysql(ADB分析型数据库)-DML语法之新增插入数据详解

    ADB分析型数据库,是阿里云平台上资源,原名叫云原生数据仓库AnalyticDB Mysql,俗称ADB分析型数据库,那么ADB的语法与mysql关系型数据库语法存在一定的差异。 本文为笔记,介绍ADB的DML语法的应用。 1. INSERT INTO INSERT INTO用于向表中插入数据,主键重复时会自动忽略当前写入数据

    2024年02月15日
    浏览(43)
  • MySQL数据库——MySQL慢查询日志(Slow Query Log)

    慢查询日志用来记录在 MySQL 中执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率低,以便进行优化。 通俗的说,MySQL 慢查询日志是排查问题的 SQL 语句,以及检查当前 MySQL 性能的一个重要功能。如果不是调优需要,一般不建议启动该

    2024年02月06日
    浏览(62)
  • 【MySQL高级篇笔记-其他数据库日志(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一、MySQL支持的日志 1、日志类型 2、日志的弊端 二、慢查询日志(slow query log) 三、通用查询日志(general query log) 1、问题场景  2、查看当前状态 3、启动日志 方式 1 :永久性方式 方式2:临时性方式  4、查看日志 5、停止日志 方式1:永

    2024年02月08日
    浏览(147)
  • MySQL-备份+日志:介质故障与数据库恢复

    本关任务: 备份数据库,然后再恢复它。 为了完成本关任务,你需要掌握: 1.MySQL的恢复机制; 2.MySQL提供的备份与恢复工具。 和大多数DBMS一样,MySQL利用备份、日志文件实现恢复。 具体理论知识在此不详细介绍。 MySQL提供了以下工具: 逻辑备份工具:mysqldump 物理备份工具

    2024年02月05日
    浏览(89)
  • 阿里云日志服务Logstore与MySQL数据库关联

    已采集日志到日志服务。更多信息,请参见数据采集。 已为日志字段创建索引。更多信息,请参见创建索引。 已有可用的MySQL数据库。更多信息,请参见创建数据库和账号。 1、在MySQL数据库中,创建用户属性表(即 chiji_user 表)。 2、添加白名单。如果是rds,设置ip白名单;

    2024年02月10日
    浏览(47)
  • 在Windows系统中配置开启MySQL数据库日志的步骤

            1.首先Win+R,打开命令运行框,输入cmd打开终端窗口。           2.输入指令mysql -u root -p回车输入密码进入mysql数据库。          3.输入:show global variables like\\\'log_bin\\\';  这里注意一定要带上“;”,回车后查看MySQL的log日志是否已近开启,若是开启状态则会如下图

    2024年02月09日
    浏览(60)
  • 开源数据库Mysql_DBA运维实战 (DCL/日志)

      SQL(Structured Query Language 即结构化查询语言) a.DDL语句   数据库定义语言: 数据库,表,视图,索引,存储过程,函数,创建删除ALTER(CREATE DROP ALTER)  b.DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE c.DQL语句   数据库查询语言:查询数据SELECT d.

    2024年02月12日
    浏览(84)
  • mysql-DBA(1)-数据库备份恢复-导入导出-日志解释

    log: hdd data :ssd  ,备份和导出都慢,缓冲池有污染。 逻辑备份:把所有的命令转换成sql语句。 修改配置文件: -A 备份所有 -B 备份哪个数据库 --master-data=1 同步 内容: 备份参数: 1.备份成文件,里面就是sql语句 2.routine: 3.trigger 触发器 4.event: 定时任务 5.-B 数据库 1.有-B 表

    2024年03月09日
    浏览(71)
  • 第77讲:二进制方式搭建MySQL数据库5.7版本以及错误日志管理

    前面是使用的yum的方式安装的MySQL数据库,在企业生产环境中大多数都用二进制方式安装。 本次使用二进制方式搭建MySQL 5.7.36版本。 1.1.下载MySQL5.7版本的二进制文件 1.2.创建mysql用户管理MySQL服务

    2024年02月03日
    浏览(63)
  • Flink-CDC——MySQL、SqlSqlServer、Oracle、达梦等数据库开启日志方法

    目录 1. 前言 2. 数据源安装与配置 2.1 MySQL 2.1.1 安装 2.1.2 CDC 配置 2.2 Postgresql 2.2.1 安装 2.2.2 CDC 配置 2.3 Oracle 2.3.1 安装 2.3.2 CDC 配置 2.4 SQLServer 2.4.1 安装 2.4.2 CDC 配置 2.5达梦 2.4.1安装 2.4.2CDC配置 3. 验证 3.1 Flink版本与CDC版本的对应关系 3.2 下载相关包 3.3 添加cdc jar 至lib目录 3.4 验

    2024年02月05日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包