mysql 事务日志 

原创
08/15 21:31
阅读数 53

Redo Log
  1.redo分为Physical Redo Log与Logical Redo Log
  2.用于在 crash recovery时已提交没有刷盘的事务(记录时间点为缓冲中页面修改完成,但还没有刷新到硬盘,即事务提交之前),如异常宕机
  2.redo日志大部分为物理日志,包括 ib_logfile0 and ib_logfile1两个文件 
  3.MySQL以循环方式写入重做日志文件。重做日志中的数据根据受影响的记录进行编码;LSN的不断增加也是通过redo log 的改变实现的
  4.聚集索引、二级索引、undo页面的修改,均需要记录Redo日志。
    
undo Log


  1.对单个读写事务的记录集合,用于回滚clustered index(cluster index 与主键关系统) record,其他读事务需要查原始记录(没有修改的数据)时,从undo记录中查(为确保事务的一致性),
  2.undo log以undo log segment存在于rollback segments中, rollback segments存在于 system tablespace, undo tablespaces, 或temporary tablespace.
  3. temporary tablespace中的undo ,用于用户定义的临时表,由于临时表不需求恢复,临时表空间的undo不会记录在redo中
  4.InnoDB 最大支持128 个rollback segments,temporary tablespace使用32个,其他96个用于对于普通表的修改, innodb_rollback_segments 用于定义 InnoDB 的回滚
  5.rollback segment 的多少依赖于rollback segment 中undo slots 的多少以及每个事务需要undo log 的多少, InnoDB page size的大小与undo slots对应关系可查看
   https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-logs.html
  6.一个事务有insert ,update, delete on 普通表与临时表会分配所有4个undo log,一个事务只有insert 时只分配一个
  7.对于普通表,undo log 从 system tablespace or undo tablespace rollback segment分配,对于临时表从temporary tablespace rollback segment分配
   
   注:在达到InnoDB读写事务最大并发数,会报事务限制错误。返回这个错误是当分配给这个事务的回滚段时,undo solt 使用完了,这时需要尝试重新运行该事务。
    临时表的回滚个数默认为32个
    
  8.对于各种操作分配算法见
  https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-logs.html
  
  InnoDB page size的大小与undo slots对应关系
  
 各种操作行为:
insert:undo 记录行插入位置的物理地址(space id ,page number,插入行,系统列),通过他们可以唯一确定插入位置。
delete操作,undo是将记录标记为delete mark,将系统列写入undo,将主键和所有索引列写入undo 
  

小结:
innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。
1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录
3.事务开始时先写undo 

参考:
浅析MySQL事务中的redo与undo 英文版本
浅析MySQL事务中的redo与undo 中文版本
MySQL Transaction logs and Crash-Recovery – Querychat
详细分析MySQL事务日志(redo log和undo log)
MySQL · 引擎特性 · InnoDB redo log漫游

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部