参考 :https://blog.csdn.net/yu757371316/article/details/81081669
参考 : https://www.jianshu.com/p/20e10ed721d0
- 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如何保证 事务的持久性?
- 第一步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝
- 第二步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
- 第三步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加写的方式
- 第四步:定期将内存中修改的数据刷新到磁盘中
fsync
和 write 操作(系统从内存同步到磁盘的操作)实际上是系统调用函数
innodb_flush_log_at_trx_commit
来控制的,该参数可以控制 redo log刷新到磁盘的策略fsync
操作,最安全的配置,保障持久性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 的读写性能。