MySQL中的几种日志
日志的分类
MySQL里面其实有三种日志。
其中redo日志和undo日志都是在Innodb存储引擎下才有的东西。
1. binlog日志
不论使用任何类型的存储引擎,都会有binlog日志。binlog日志是一个数据库变更日志。
它记录了像那种DML还有DDL的一些语句。
binlog日志,它其实一般可能作用就是一个数据库的一个宕机后的恢复工作。
然后MySQL的主从复制原理也是基于binlog日志的。还有像一般还有场景就是解决这种数据库和缓存之间一致性,可以用一个canal组件去监听binlog,实现一种这种缓存一致性,也是用到了binlog日志。因为它允许缓存系统实时地捕获数据库中的变更,并相应地更新缓存。
binlog日志是在server层的,它和存储引擎没有关系。
2. redo日志
redo日志它其实是用于帮助实现mysql持久化、隔离级别中持久化。
持久性:指数据库系统能够保证事务提交后,对数据的修改将被永久保存,即使在系统发生故障或崩溃的情况下也能够恢复到一致的状态。
当事务提交时,对数据的修改首先记录到Redo日志中,然后才将数据写入磁盘。在系统崩溃后,数据库引擎可以使用Redo日志中的信息重新应用事务的修改,从而还原数据到一致的状态。
redo日志的作用也有两个:
- 数据宕机之后的一个恢复工作。即为上面一段所描述的内容。
- mysql里面有一个bufferpool缓冲池的机制。缓冲池不是立马刷新到磁盘的。它是由一定的频率从那个内存刷新到磁盘,但是如果刷新出错了,也是需要依靠这个redo日志来恢复的。当然redo日志也分为两部分,一个是在内存里面有的,然后是磁盘中有一部分。它是一种顺序追加的形式去刷盘的。
3. undo日志
undo日志的作用也有两个:
- 保证原子性,就是一个事务,他的一个同时成功或同时失败,他的那个回滚,就是基于他那个undolog日志。undolog日志就是一个反向逻辑,就比如insert,他对应记录会记录一个delete。
- 还有一个最主要作用就是实现MVCC, 用到了这个undolog日志。在实现MVCC中,undolog日志形成了一个undolog版本链。undolog版本链就是它会通过普通的select语句,在MVCC的时候决定返回你当前这个记录的哪一个版本。就是也是依赖于undolog版本去形成的一个单项链表来实现的。
参考资料:两分钟提炼总结mysql中的几种日志