MySQL中的日志文件,有这么两类常常讨论到:undo日志与redo日志。

参考  :https://blog.csdn.net/yu757371316/article/details/81081669 

参考  : https://www.jianshu.com/p/20e10ed721d0

我们都知道事务有4种特性:原子性、一致性、隔离性和持久性,在事务中的操作,要么全部执行,要么全部不做,这就是事务的目的。事务的隔离性由锁机制实现,原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。
  • redo 日志与undo日志分别是什么?
  • redo 如何保证事务的持久性?
  • undo log 是否是redo log的逆过程?

redo是啥

重做日志(redo log)用来保证事务的持久性,即事务ACID中的D。实际上它可以分为以下两种类型:

物理Redo日志
逻辑Redo日志

在InnoDB存储引擎中,大部分情况下 Redo是物理日志,记录的是数据页的物理变化。

Redo log的主要作用是用于数据库的崩溃恢复

Redo 的组成

Redo log可以简单分为以下两个部分:

  • 一是内存中重做日志缓冲 (redo log buffer),是易失的,在内存中
  • 二是重做日志文件 (redo log file),是持久的,保存在磁盘中

redo如何保证 事务的持久性?

mysql_redo
  • 第一步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝
  • 第二步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
  • 第三步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加写的方式
  • 第四步:定期将内存中修改的数据刷新到磁盘中

fsync  和  write 操作(系统从内存同步到磁盘的操作)实际上是系统调用函数

通过Force Log at Commit 机制实现事务的持久性,即当事务提交时,先将 redo log buffer 写入到 redo log file 进行持久化,待事务的commit操作完成时才算完成。
这种做法也被称为 Write-Ahead Log(预先日志持久化)
Force Log at Commit机制就是靠InnoDB存储引擎提供的参数
innodb_flush_log_at_trx_commit来控制的,该参数可以控制 redo log刷新到磁盘的策略
当参数值为
默认值 1 :表示事务提交时必须调用一次 fsync 操作,最安全的配置,保障持久性
参数值为2 :则在事务提交时只做 write 操作,只保证将redo log buffer写到系统的页面缓存中,不进行fsync操作
参数值为0:等于说是关闭redo log      这个操作仅在master thread 中完成,而在master thread中每1秒进行一次重做日志的fsync操作
Force Log at Commit机制保证事务的持久性,实际上重做日志的实现还要依赖于mini-transaction。
 
 

undo是啥

undo是如何进行回滚的

undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

undo日志,只将数据库逻辑地恢复到原来的样子,在回滚的时候,它实际上是做的相反的工作,比如一条INSERT ,对应一条 DELETE,对于每个UPDATE,对应一条相反的 UPDATE,将修改前的行放回去。undo日志用于事务的回滚操作进而保障了事务的原子性。

 

undo日志用于存放数据修改被修改前的值,假设修改 tba 表中 id=2的行数据,把Name=’B’ 修改为Name = ‘B2’ ,那么undo日志就会用来存放Name=’B’的记录,如果这个修改出现异常,可以使用undo日志来实现回滚操作,保证事务的一致性。

把Name=’B’ 修改为Name = ‘B2’ ,那么undo日志就会用来存放Name=’B’的记录

可以使用undo日志来实现回滚操作,保证事务的一致性。

对数据的变更操作,主要来自 INSERT UPDATE DELETE,而UNDO LOG中分为两种类型,一种是 INSERT_UNDO(INSERT操作),记录插入的唯一键值;一种是 UPDATE_UNDO(包含UPDATE及DELETE操作),记录修改的唯一键值以及old column记录。

 undo 参数:

innodb_max_undo_log_size​     控制最大undo tablespace文件的大小,

只有在启动innodb_undo_log_truncate 

undo tablespace 超过innodb_max_undo_log_size 阀值时才会去尝试truncate(截短)。该值默认大小为1G,truncate后的大小默认为10M

innodb_undo_tablespaces

​ 设置undo独立表空间个数,范围为0-128, 默认为0,0表示表示不开启独立undo表空间 且 undo日志存储在ibdata文件中。该参数只能在最开始初始化MySQL实例的时候指定,如果实例已创建,这个参数是不能变动的,如果在数据库配置文 件 .cnf 中指定innodb_undo_tablespaces 的个数大于实例创建时的指定个数,则会启动失败,提示该参数设置有误。

 每个文件(undo)默认大小为10M.

什么时候需要来设置这个参数呢?

​ 当DB写压力较大时,可以设置独立UNDO表空间,把UNDO LOG从ibdata文件中分离开来,指定 innodb_undo_directory目录存放,可以制定到高速磁盘上,加快UNDO LOG 的读写性能。

原文地址:https://www.cnblogs.com/-Aiai/p/15224244.html