首页 > 数据库 >【MySQL 的三大日志的作用】

【MySQL 的三大日志的作用】

时间:2024-06-22 11:58:43浏览次数:13  
标签:事务 Log 写入 MySQL 磁盘 日志 Redo 三大


在管理MySQL数据库时,了解和区分数据库使用的三大日志类型至关重要。这些日志对于确保数据的完整性、提供恢复机制以及维持数据库的稳定性发挥着关键作用。最主要还是小豆前段时间去参加面试被问到了这些内容,下面将详细讨论Redo Log、Binlog和Undo Log的异同。

Redo Log(重做日志)

  • 作用:Redo Log主要用于保证事务的持久性和数据库的崩溃恢复能力。当数据库发生崩溃时,InnoDB存储引擎可以使用Redo Log来恢复未提交事务的数据,确保数据的一致性。
  • 内容:在事务处理中产生的所有数据页的物理修改,比如数据页的变动。它包括内存中的Redo Log Buffer和磁盘上的Redo Log File。
  • 写入时机:在事务执行过程中,数据的更改首先被写入Redo Log Buffer,然后在事务提交时,这些更改会被写入到Redo Log File中。这个过程保证了MySQL可以在系统意外重启后,按照事务提交前的状态重新构建数据页,进而实现持久性。

Binlog(二进制日志)

  • 作用:Binlog主要用于数据复制(主从复制)和数据恢复。它记录了所有修改了数据库状态的SQL语句,比如实际执行的SQL语句。使得可以在主从复制环境中同步数据,或者在数据丢失后进行恢复。
  • 内容:Binlog记录了逻辑操作,如SQL语句。它以二进制的形式保存,并且可以是三种格式之一:Statement(记录SQL语句)、Row(记录行级更改)或Mixed(两者结合)。
  • 写入时机:在事务提交时,Binlog会记录本次修改的数据。Binlog的写入通常在Redo Log之后,以确保数据的一致性。

Undo Log(回滚日志)

  • 作用:Undo Log主要用于实现事务的原子性和隔离性。它记录了事务所做的更改,以便在事务失败或需要回滚时,可以恢复到事务开始之前的状态。
  • 内容:Undo Log记录了数据被修改前的样子,以及事务的回滚信息。它允许数据库在读取旧版本的数据时,能够提供一致的视图。
  • 写入时机:在数据被修改时,Undo Log会同时记录原始数据。在事务回滚或需要通过MVCC读取旧数据版本时,Undo Log会被使用。

日志之间的关系

Redo LogUndo Log是InnoDB存储引擎紧密关联的组成部分,其中Redo负责记录事务的前景操作,Undo负责记录事务的后景操作。而Binlog记录了执行修改的SQL语句,这三者协同工作保障了事务的ACID特性。Redo和Undo日志通常存在于存储引擎层面,而Binlog则是MySQL数据库级别的记录。

  • Redo Log是InnoDB特有的,专门记录物理更改,用于保证数据的持久性和崩溃恢复。
  • Binlog是MySQL服务器层面的,记录逻辑更改,用于主从复制和数据恢复,记录逻辑操作。
  • Undo Log也是InnoDB特有的,记录数据改变前的状态,用于事务的回滚和多版本并发控制(MVCC)。

日志写入流程

以一次事务执行为例,使用流程图画一下日志写入流程:

在这个流程图中,我们描述了以下步骤:

  1. 用户通过执行START TRANSACTIONBEGIN或者DML语句发起一个事务。
  2. 事务执行数据修改,同时记录到Undo Log(记录修改前的状态)和Redo Log Buffer(记录修改的内容)。
  3. 事务数据预写入内存中的Redo Log Buffer,为提交做好准备,但这是临时的。
  4. 事务完成所有操作。
  5. 事务提交时,Redo Log Buffer中的内容被写入到磁盘上的Redo Log File,确保数据的持久性。
  6. 同时,事务的更改被记录到Binlog Buffer,为复制和数据恢复做准备。
  7. 执行COMMIT命令,请求提交事务。
  8. 在提交时,事务确保Redo Log Buffer和Binlog Buffer中的更改都已同步到各自的磁盘文件。
  9. 事务将修改最终应用到磁盘文件,完成数据的持久化。
  10. 返回事务提交成功的确认给用户。

其他问题

1、会不会出现数据库磁盘中的文件已经被修改,但是没有记录到binlog日志中的情况?

通常情况下,这种情况是不会发生的。因为数据库在执行写操作的时候,会先将操作记录在Binlog中,然后再修改磁盘中的对应数据库文件。这就是所谓的write-ahead logging(WAL,预写式日志),即修改磁盘中的文件之前,必须先将相关的操作信息写入日志。

数据库维护了一个缓冲区,当有数据需要写入磁盘时,首先将这些数据写入缓冲区,然后再由缓冲区将这些数据批量写入磁盘,这样可以提高数据写入磁盘的效率。

而缓冲区在将数据写入磁盘之前,必须先将相关的操作信息写入日志。也就是说,任何修改磁盘中文件的操作,必须先写入日志。只有在日志成功写入后,缓冲区的数据才能写入硬盘。这种机制保证了在数据库系统崩溃的情况下,可以通过重放日志来恢复数据,确保数据的最终一致性和原子性。

至于你提到的这种情况,可能是由于些别的情况,比如操作系统崩溃,数据库软件的bug等等,导致数据已经写入了磁盘但是日志还没有来得及写入。但是这种情况在正常操作下是非常少见的,一般只会在极端的情况下才会发生。

2、事务提交前直接把数据写入磁盘就能保证持久性,为什么还要用redo log呢?

1、性能问题,直接写入磁盘(随机写)的性能通常比顺序写入要差。直接写入磁盘是随机写入。而Redo Log通常是顺序写入的,这可以提高写入效率。

2、原子性,如果在将数据写入磁盘的过程中发生系统崩溃(如电源故障、硬件故障等),那么可能只有部分数据被写入,导致数据不一致。Redo Log通过记录事务所做的修改,可以在故障后重做这些操作,确保事务的原子性。

3、并发问题,在高并发环境下,如果每个事务都直接写入磁盘,那么在多个事务同时修改同一条记录时,可能会出现冲突。Redo Log通过记录事务所做的修改,可以在事务提交时快速完成,而不需要对数据行进行长时间的锁定。

标签:事务,Log,写入,MySQL,磁盘,日志,Redo,三大
From: https://blog.csdn.net/m0_50116974/article/details/139871772

相关文章

  • MySQL数据库故障恢复
    1、故障类型分类在此次故障中,对进行备份也未开启binlog日志,无法直接还原数据库,属于典型表内mysql-delete数据误删除。2、故障分析与可行性方案制定对于mysqlinnodb误删除导致记录丢失的恢复方案有三种,分别是备份还原、binlog还原和记录深度解析。MySQL数据库的恢复流程:1、......
  • 如何使用SQL工具批量执行SQL文件?(以MySQL和SQLynx为例)
    目录1.配置MySQL数据源2.打开SQL文件3.执行SQL文件4.检查执行结果5.SQL文件示例6.注意事项7.总结在现代数据库管理和操作中,批量执行SQL文件在MySQL中显现出其巨大的价值和不可替代的作用。通过将多个SQL语句集成在一个文件中进行批量处理,数据库管理......
  • 【MySQL连接器(Python)指南】02-MySQL连接器(Python)版本与实现
    文章目录前言MySQL连接器(Python)版本MySQL连接器(Python)实现总结前言MySQL连接器(Python),用于让Python程序能够访问MySQL数据库。要想让Python应用程序正确高效地使用MySQL数据,就需要深入了解MySQL连接器的特性和使用方法。MySQL连接器(Python)版本下表......
  • 详解mysql安装、常见问题及解决方法
    一、MySQL简介MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),由瑞典公司MySQLAB开发,后被SunMicrosystems收购,最终归属Oracle公司所有。它以其快速、可靠、可扩展的特性而闻名,并且因其开源的性质在各类应用中得到了广泛应用。以下是MySQL的详细简介:主......
  • Springboot计算机毕业设计中小学生的古诗词学习小程序【附源码】开题+论文+mysql+程序
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景古诗词作为中华文化的瑰宝,承载了丰富的历史信息和深厚的文化底蕴。然而,在中小学生的古诗词学习过程中,传统的教学方式往往侧重于背诵和应试,缺乏对学生......
  • MySQL数据库技术
    数据库基本概念1.数据库(Database,简称DB)数据库是存放数据的仓库,是长期储存在计算机内、有组织有结构的、可共享的数据集合。2.数据库管理系统(DatabaseManagementSystem,简称DMBS)数据库管理系统是为数据库的建立、使用和维护而配置的数据库管理软件,它位于用户与操作系......
  • [转] MySQL binlog 日志自动清理及手动删除
    参考转载自mysqlbinlog日志自动清理及手动删除-景岳-博客园说明当开启mysql数据库主从时,会产生大量如mysql-bin.00000*log的文件,这会大量耗费您的硬盘空间。mysql-bin.000001mysql-bin.000002mysql-bin.000003mysql-bin.000004mysql-bin.000005…有三种解......
  • 并发编程的三大特性
    并发编程的三大特性一、原子性1.1什么是并发编程的原子性JMM(JavaMemoryModel)。不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。让Java的并发编程可以做到跨平......
  • MySQL之复制(九)
    复制复制管理和维护确定主备是否一致在理想情况下,备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误,备库同样可能因为MySQL自身的特性导致数据不一致,例如MySQL的Bug、网络中断、服务器崩溃,非正常关闭或者其他一些错误。(......
  • MySQL----表级锁&行级锁&排它锁和共享锁&意向锁
    MySQL的锁机制锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。在MySQL中,不同存储引擎使用不同的加锁方式;我们以InnoDB存储引擎为例介绍MySQL中的锁机制,其他存储引擎中的锁相对简单一些。表级锁&行级锁表级锁:对整张表加锁。开销小,加锁快,不会出现......