【编程底层原理】mysql的redo log undo log bin log日志的作用,以及何时生成,涉及到哪些参数变量

news/2024/9/25 8:29:56/

MySQL中的redo log、undo log和bin log是三种重要的日志,它们在数据库事务处理、数据持久性和复制等场景中发挥着关键作用。

1. Redo Log(重做日志)

    • 作用:Redo log用来保证事务的持久性。当数据库发生故障时,可以使用redo log来恢复数据到最后一次提交的状态。它记录了数据页的物理修改,即事务对数据页所做的更改。
    • 何时生成:在事务执行过程中,每当有数据页被修改时,对应的redo log就会被生成,并存储在内存中的redo log buffer里。
    • 参数变量: - innodb_log_buffer_size:控制redo log buffer的大小。 - innodb_flush_log_at_trx_commit:控制事务提交时redo log的刷盘行为,可以设置为0、1或2。 - innodb_log_file_size:定义单个redo log文件的大小

2. Undo Log(回滚日志)

    • 作用:Undo log用于事务的原子性和MVCC(多版本并发控制)。如果事务需要回滚或数据库崩溃,undo log可以用于恢复原始数据。同时,它支持在读取操作中提供数据的旧版本,使得在高并发环境下,不同的事务可以看到数据的不同版本。
    • 何时生成:在事务开始时创建,事务的每个修改操作都会生成undo log。
    • 参数变量: - 没有特定的参数直接控制undo log的大小,但它受innodb_buffer_pool_size的影响,因为undo log存储在buffer pool中。

3. Binlog(二进制日志)

    • 作用:Binlog是MySQL服务器层的日志,用于记录所有数据库表结构变更和数据修改的日志(不包括SELECT和SHOW这类操作)。它主要用于数据的复制和恢复。
    • 何时生成:在事务提交时生成,记录了该事务期间所有修改数据的操作。
    • 参数变量: - expire_logs_days:设置binlog文件的过期天数。 - max_binlog_size:定义单个binlog文件的最大大小。 - sync_binlog:控制每次事务写入binlog后是否进行fsync同步到磁盘。

4.总结

这些日志共同工作,确保了MySQL数据库的稳定性和数据的一致性。Redo log和undo log是InnoDB存储引擎特有的日志,而binlog则是MySQL服务器层的日志,它们之间的区别主要在于作用、生成时机和适用对象。

5.完整的流程

1. 开始事务

  • 描述:这是数据库事务的起点,标志着一系列操作的开始,这些操作将作为一个整体被执行。

2. 生成Undo Log

  • 描述:在事务开始时创建,用于记录事务对数据的每个修改操作的反向操作。如果事务需要回滚或数据库需要恢复到某个一致的状态,Undo Log将被用来撤销已经进行的修改。

3. 事务修改数据

  • 描述:在事务中,数据被修改。这可能包括插入、更新或删除操作。

4. 生成Redo Log

  • 描述:每当事务修改数据时,相应的Redo Log会被生成。Redo Log记录了数据页的物理修改,确保在发生故障时可以从日志中重放操作,恢复到最后一次提交的状态。

5. 事务提交

  • 描述:当事务中的所有操作成功完成,并且用户或应用程序发出提交指令时,事务将被标记为提交。这通常意味着所有更改都将被永久保存到数据库中。

6. 刷写Redo Log到磁盘

  • 描述:在事务提交时,为了保证持久性,Redo Log从内存中的Redo Log Buffer刷写到磁盘上的日志文件中。这个过程确保了即使在数据库服务器崩溃的情况下,修改也能被恢复。

7. 生成Bin Log

  • 描述:在事务提交时生成,Bin Log记录了该事务期间所有修改数据的操作。它是MySQL复制和数据恢复的关键组成部分,因为它提供了一种机制来复制和恢复在主服务器上执行的操作。

8. 事务完成

  • 描述:一旦Redo Log被刷写到磁盘,并且Bin Log被生成,事务就被认为是完整且持久化的。此时,事务的所有操作都已经被安全地保存,并且可以被系统其他部分访问。

Redo Log 参数变量

  • innodb_log_buffer_size:控制Redo Log Buffer的大小,这个缓冲区用于在将日志写入磁盘之前存储Redo Log。
  • innodb_flush_log_at_trx_commit:控制事务提交时Redo Log的刷盘行为。可以设置为0(不刷盘)、1(每次事务提交都刷盘)或2(每秒刷盘一次)。
  • innodb_log_file_size:定义单个Redo Log文件的大小,影响Redo Log文件的总量和刷盘操作的频率。

Undo Log 参数变量

  • innodb_buffer_pool_size:虽然Undo Log的大小没有直接的参数控制,但它存储在Buffer Pool中,因此这个参数影响Undo Log的存储和性能。

Bin Log 参数变量

  • expire_logs_days:设置Binlog文件的过期天数,之后这些文件将被自动删除。
  • max_binlog_size:定义单个Binlog文件的最大大小,达到这个大小时,Binlog将被旋转。
  • sync_binlog:控制每次事务写入Binlog后是否进行fsync同步到磁盘,以确保数据的持久性。

这些步骤和参数共同确保了MySQL数据库的稳定性和数据的一致性,无论是在正常操作还是在系统故障后。


http://www.ppmy.cn/news/1530210.html

相关文章

Cryptopp进行RSA加密解密

因最近工作需要,要与一个java服务器进行部分数据交互,其中用户名、密码的加密方式为RSA非对称加密,故研究了一下使用Cryptopp库进行RSA的公钥加密。 搜索了很多资料,其中觉得十分有用的一句话是: 客户端使用RSA加密通…

C++语言桌面应用开发GTK3 Gtkmm3 Glade

文章目录 Gikmm 简介安装 Gtkmm安装 GTK安装 Gladedemo.glade 文件完整示例 demo.cpp编译运行GTK 主题推荐主题 Gikmm 简介 Gtkmm 是一个用于创建图形用户界面(GUI)的 C 库,它是基于流行的 GTK 库的。GTK 是一个跨平台的 GUI 工具包&#xff…

洛谷P2571.传送带

洛谷P2571.传送带 三分模板题 用于单峰函数求极值 一定可以将答案路径分成三段即AE - EF - FD (E和A可能重复,F和D可能重合) E在线段AB上,F在线段CD上 因为有两个不定点EF,因此假设E为参数,三分求F的位置再外层三分求E的位置 …

240924-Windows映射网络驱动器的方法

在Windows上加载网络盘(映射网络驱动器)可以通过以下步骤完成: 方法一:通过文件资源管理器 打开文件资源管理器: 可以按 Win E 打开,或者直接点击任务栏上的文件资源管理器图标。 点击“此电脑”&#x…

Java服务端服务发现:Nacos与Eureka的高级特性

Java服务端服务发现:Nacos与Eureka的高级特性 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,服务发现是实现服务间通信的关键机制。Nacos和Eureka是两种…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL18

实现3-8译码器① 描述 下表是74HC138译码器的功能表. E3 E2_n E1_n A2 A1 A0 Y0_n Y1_n Y2_n Y3_n Y4_n Y5_n Y6_n Y7_n x 1 x x x x 1 1 1 1 1 1 1 1 x x 1 x x x 1 1 1 1 1 1 1 1 0 x x x x x 1 1 1 1 1 1 1 1 1 …

鸿蒙OpenHarmony【小型系统内核(用户态启动)】子系统开发

用户态启动 用户态根进程启动 根进程是系统第一个用户态进程,进程ID为1,它是所有用户态进程的祖先。 图1 进程树示意图 根进程的启动过程 使用链接脚本将如下init启动代码放置到系统镜像指定位置。 #define LITE_USER_SEC_ENTRY __attribute__((s…

Ansible部署与应用基础

由于互联网的快速发展导致产品更新换代速度逐步增长,运维人员每天都要进行大量的维护操作,按照传统方式进行维护使得工作效率低下。这时部署自动化运维就 可以尽可能安全、高效的完成这些工作。 一、Ansible概述 1.什么是Ansible Ansible 是基于 Pytho…