mysql中的日志系统,有以下几类:
英文名 | 中文名 |
---|---|
binlog | 归档日志 |
errorlog | 错误日志 |
slowlog | 慢日志 |
relaylog | 中继日志 |
undolog | 回滚日志 |
redolog | 重做日志 |
undolog 回滚日志
undolog是Mysql的回滚日志, 存储的是老版本的数据
作用:
- 存储老版本数据
- 用于在事务执行失败回滚到事务执行之前的版本
undolog 会在事务提交之后删除。undolog 交由Mysql的Purage线程来负责删除。Purage 会定期检查undolog中的delete_bit标志,这个标志会在事务提交后改为true,Purage进程发现标志为true的undolog 就会将其删除。
redolog 重做日志
redo log是Mysql的物理日志, 负责记录某个数据页执行了什么样的操作
作用
- 负责记录事务提交前对数据的修改,
- 让Mysql提交事务的时候无需等待数据持久化到磁盘,只需要将redolog 持久化到磁盘就可以了
- 未清除的redolog的数量标识了为刷盘的脏页数量
为什么提交事务是选择持久化redo log, 而不是持久化数据到磁盘
持久化数据到磁盘是随机IO的过程,相对于顺序IO速度慢,所以Mysql选择将数据缓存起来,等待一个合适的时间一次性写入磁盘,减少IO。但是将数据缓存在内存中是有丢失的风险,而redolog 是顺序IO,速度较快,mysql 选择redolog持久化。
redo log是顺序写, 持久化的效率比随机写的效率要高, 并且redo log记录了数据的变化情况, 只要redo log在就可以保证在Mysql重启后恢复数据。
undolog 和redolog的区别
undolog 记录的是事务执行过程中旧数据的状态,redolog记录的是数据更新之后的状态。
undolog 保障事务的原子性,而redolog 保障的是事务的一致性和持久性。
binlog 归档日志
binlog是mysql的server层实现的,是所有引擎通用的。
作用:
binlog记录的是mysql原始的执行语句,并采取的是追加写入的方式记录的,所有可以恢复数据库在任意时刻的数据状态。所有binlog叫做归档日志,同时它也是主从复制的依赖,从库通过复制主库的binlog回放来同步主库的数据。
Mysql的WAL(Write Ahead Login)机制
先写日志到磁盘,后写数据到磁盘。Mysql的写操作不知立刻写入磁盘的,而是先写日志,等redolog 和 binlog持久化到磁盘后,再由后台进程选择时间将数据持久化到硬盘。
待补充。。。