innodb(4) redo and undo log

innodb 是通过日志来实现事务的

redo log 实现了事务中的持久性

undo log  实现了事务中的原子性

undo log还实现了多版本并发控制 (mvcc) 下一篇讲解


undo log

undo log的原理很简单, 为了实现事务的原子性, 在对数据进行修改之前, 都会提前备份 (备份到 undo log中), 如果在执行数据修改的过程中出现错误或者出现rollback , 系统可以利用undo log文件将数据恢复到事务提交之前的状态

举例说明 : 

假设有A、B两个数据,值分别为1,2。 进行+2的事务操作。 
A.事务开始. 
B.记录A=1到undo log. 
C.修改A=3. 
D.记录B=2到undo log. 
E.修改B=4. 
F.将undo log写到磁盘。 
G.将数据写到磁盘。 
H.事务提交 

通过在数据更新之前记录数据的值, 来实现事务的原子性

q : undo log为什么不能实现事务的持久性 ? 

从严格意义上来讲, undo log可以实现持久化, 但是前提是

  • 必须将数据在事务提交前写到磁盘(操作1)。只要事务成功提交,数据必然已经持久化
  • Undo log记录数据必须优先操作1 ( 用于数据回滚

这样做最严重的问题就是 性能问题, 我们知道, 对于数据的更改首先是对bp进行修改, 满足一定条件后, 将脏页刷新到磁盘中

如果通过undo log来实现持久化, 我们就必须保证在事务提交之前将数据刷新到磁盘上, 否则如果服务器宕机, 在bp中的脏页数据就会丢失, 无法恢复, 但是这样做就会增加大量的IO次数, 性能下降

因此设计者们引入了另外一种机制来实现持久化,即 redo log。在事务提交前,只要将 redo log 持久化即可,不需要将数据持久化。当系统宕机时,虽然数据还没来得及刷回磁盘,但是 redo log 已经持久化了,系统可以根据 redo log 的内容,将所有数据恢复到最新的状态。


redo log

redo log 其本质就是记录一些执行过的sql的文件, 用于数据恢复

由于innodb 存储引擎引入了bp这个概念, 我们更新的数据不会第一时间刷新到磁盘上, 这就存在风险, 如果这段时间服务器宕机, 这部分数据的修改就就会丢失, 因此将我们执行过的sql报错到redo log中, 来保证服务器宕机, 这部分数据也可以恢复

redo log空间并不是无限大的, 通过 : show variables like 'innodb_log%'; 可以查看(默认大小48M)

redo log是通过追加写的方式来插入sql的, 因此当存储的sql大小到达一定限制(checkpoint机制), 会执行一次将bp中的脏页刷新到磁盘的操作, 否则redo log的sql被覆盖, 则无法完成数据恢复

为了保证 redo log有更好的性能 , 做了以下几点设计 : 

① : 尽量保存redo log占据连续的空间 , 在系统的第一次启动时就为redo log分配空间, 我们知道顺序写入和随机写入效率相差很大

② : 批量写入日志 , 日志不是直接写入到文件, 而是先写入到 redo log buffer, 然后并发将buffer中的数据一起写入磁盘(分批次)

③ : 追加写 , 占用较少的空间 ( 当数据占用了全部空间, 覆盖最前面的数据, 继续写入)

 举例说明 : 

假设有A、B两个数据,值分别为1,2。 进行+2的事务操作。 
A.事务开始. 
B.记录A=1到undo log. 
C.修改A=3. 
D.记录A=3到redo log. 
E.记录B=2到undo log
F. 修改B=4。 
G.记录B=4到redo log。 
H.将redo log写入磁盘.

I. 事务提交 

A-G的过程是在redo log buffer中操作的

保证事务提交之前, 将redo log写入到磁盘

将redo log中的数据持久化有三种方法 : 

1. 事务提交时, 将数据写到redo log buffer中, 使用线程并发持久化到redo log中, 但是如果mysql宕机, 数据会丢失

2. 事务提交时, 将数据持久化到redo log中 (默认配置)

3. 事务提交时, 将数据写到操作系统缓存中, 即使mysql挂掉, 操作系统不挂掉, 数据也不会丢失


恢复(Recovery)


未提交的事务和回滚了的事务也会记录Redo Log,因此在进行恢复时,这些事务要进行特殊的处理.有2种不同的恢复策略:

  • 进行恢复时,只重做已经提交了的事务。(返回给客户端的是已经提交一定保证数据的可恢复持久性)
  • 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些未提交的事务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值