MySQL 撤销日志与重做日志(Undo Log与Redo Log)相关总结

 更新时间:2021年03月24日 10:36:13   作者:Thresh  
这篇文章主要介绍了MySQL 撤销日志与重做日志(Undo Log与Redo Log)相关总结,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下

Undo Log

数据库事务开始之前,会将要修改的记录存放到 Undo 日志里,当事务回滚时或者数据库崩溃时,可以利用 Undo 日志,撤销未提交事务对数据库产生的影响。

Undo Log产生和销毁

Undo Log在事务开始前产生;事务在提交时,并不会立刻删除undo log,innodb会将该事务对应的undo log放入到删除列表中,后面会通过后台线程purge thread进行回收处理。
Undo Log属于逻辑日志,记录一个变化过程。例如执行一个delete,undolog会记录一个insert;执行一个update,undolog会记录一个相反的update。

Undo Log存储

Undo log采用段的方式管理和记录。在innodb数据文件中包含一种rollback segment回滚段,内部包含1024个undo log segment。可以通过下面一组参数来控制Undo log存储。

show variables like '%innodb_undo%'; 

Undo Log作用

实现事务的原子性

Undo Log 是为了实现事务的原子性而出现的产物。事务处理过程中,如果出现了错误或者用户执行了 ROLLBACK 语句,MySQL 可以利用 Undo Log 中的备份将数据恢复到事务开始之前的状态。

实现多版本并发控制(MVCC)

Undo Log 在 MySQL InnoDB 存储引擎中用来实现多版本并发控制。事务未提交之前,Undo Log保存了未提交之前的版本数据,Undo Log 中的数据可作为数据旧版本快照供其他并发事务进行快照读。

事务A手动开启事务,执行更新操作,首先会把更新命中的数据备份到 Undo Buffer中。
事务B手动开启事务,执行查询操作,会读取 Undo 日志数据返回,进行快照读

Redo Log

指事务中修改的任何数据,将最新的数据备份存储的位置(Redo Log),被称为重做日志。

Redo Log 的生成和释放

随着事务操作的执行,就会生成Redo Log,在事务提交时会将产生Redo Log写入Log Buffer,并不是随着事务的提交就立刻写入磁盘文件。
等事务操作的脏页写入到磁盘之后,Redo Log 的使命也就完成了,Redo Log占用的空间就可以重用(被覆盖写入)。

Redo Log 工作原理

Redo Log 是为了实现事务的持久性而出现的产物。防止在发生故障的时间点,尚有脏页未写入表的 ibd 文件中,在重启 MySQL 服务的时候,根据 Redo Log 进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。

Redo Log 写入机制

Redo Log 文件内容是以顺序循环的方式写入文件,写满时则回溯到第一个文件,进行覆盖写

write pos 是当前记录的位置,一边写一边后移,写到最后一个文件末尾后就回到 0 号文件开头;
checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件;
write pos 和 checkpoint 之间还空着的部分,可以用来记录新的操作。如果 write pos 追上checkpoint,表示写满,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint 推进一下。

Redo Log相关配置参数

每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组至少有2个重做日志文件,默认为ib_logfile0和ib_logfile1。可以通过下面一组参数控制Redo Log存储

show variables like '%innodb_log%';

Redo Buffer 持久化到 Redo Log 的策略,可通过 Innodb_flush_log_at_trx_commit 设置

0:每秒提交 Redo buffer ->OS cache -> flush cache to disk,可能丢失一秒内的事务数据。由后台Master线程每隔 1秒执行一次操作。
1(默认值):每次事务提交执行 Redo Buffer -> OS cache -> flush cache to disk,最安全,性能最差的方式。
2:每次事务提交执行 Redo Buffer -> OS cache,然后由后台Master线程再每隔1秒执行OS cache -> flush cache to disk 的操作。

一般建议选择取值2,因为 MySQL 挂了数据没有损失,整个服务器挂了才会损失1秒的事务提交数据。

以上就是MySQL 撤销日志与重做日志(Undo Log与Redo Log)相关总结的详细内容,更多关于MySQL 撤销日志与重做日志(Undo Log与Redo Log)的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL错误代码2058和2059的解决办法

    MySQL错误代码2058和2059的解决办法

    这篇文章主要介绍了MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,下面就来介绍一下解决方法,感兴趣的可以了解一下
    2025-03-03
  • MySql8.0以上版本正确修改ROOT密码的方法

    MySql8.0以上版本正确修改ROOT密码的方法

    这篇文章主要介绍了MySql8.0以上版本正确修改ROOT密码的方法,文中给大家提到了成功部署完毕后出现故障情况,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • mysql判断查询条件是否包含某字符串的7种方式

    mysql判断查询条件是否包含某字符串的7种方式

    本文主要介绍了mysql判断查询条件是否包含某字符串,主要介绍了7种方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Windows下mysql 8.0.12 安装详细教程

    Windows下mysql 8.0.12 安装详细教程

    这篇文章主要为大家详细介绍了Windows下mysql 8.0.12 安装详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Windows平台下MySQL安装与配置方法与注意事项

    Windows平台下MySQL安装与配置方法与注意事项

    这篇文章主要介绍了Windows平台下MySQL安装与配置方法与注意事项,需要的朋友可以参考下
    2017-04-04
  • mysql 8.0.12 安装配置方法并修改密码

    mysql 8.0.12 安装配置方法并修改密码

    这篇文章主要为大家详细介绍了mysql 8.0.12 安装配置,及修改密码的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • MySql版本问题sql_mode=only_full_group_by的完美解决方案

    MySql版本问题sql_mode=only_full_group_by的完美解决方案

    这篇文章主要介绍了MySql版本问题sql_mode=only_full_group_by的完美解决方案,需要的朋友可以参考下
    2017-07-07
  • 深入浅出讲解MySQL的并行复制

    深入浅出讲解MySQL的并行复制

    这篇文章主要给大家介绍了关于MySQL并行复制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Mysql多主一从数据备份的方法教程

    Mysql多主一从数据备份的方法教程

    这篇文章主要给大家介绍了关于Mysql多主一从数据备份的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-12-12
  • 开启MySQL远程连接的方法

    开启MySQL远程连接的方法

    这篇文章主要介绍了开启MySQL远程连接的方法,帮助大家更好的理解和学习MySQL数据库的使用,感兴趣的朋友可以了解下
    2020-12-12

最新评论