binlog  redolog  MVCC

 

  • binlog:服务层生产日志,数据恢复、数据库复制
  • redo log:数据在物理层面的修改,断电恢复、保证一致性和持久性,顺序 :写入数据->redo log buffer->file system buffer->fsync操作->redo log file ->commit

binlog格式

在MySQL5.1之前,所有的binlog都是基于SQL语句级别的。但是应用这种格式的binlog进行数据恢复时,如果SQL语句带有rand或uuid等函数,可能导致恢复出来的数据与原始数据不一致。因此从5.1版本开始,MySQL引入了binlog_format参数,该参数有三种可选值:statement、row和mixed:

  • statement就是之前的格式,基于SQL语句来记录
  • row记录的则是行的更改情况,可以避免之前提到的数据不一致的问题
  • 但是row格式有一个不好的地方就是当修改的行数很多时,生成的binlog占用很大的空间,占用大量空间的同时还会耗费大量IO资源,因此MySQL又提供了一种折中的方案——mixed。在mixed模式下,MySQL默认仍然采用statement格式进行记录,但是一旦它判断可能会有数据不一致的情况发生,则会采用row格式来记录

https://www.jianshu.com/p/907f9002442e

redo log,也就是重做日志

事实上这就是我们接下来要讲的redo log,也就是重做日志,它是InnoDB引擎特有的,记录了InnoDB引擎下的事务日志。

redo log作用

同样,我们首先要搞明白的是,已经有binlog了,为什么还需要redo log。

因为两者分工不同。binlog主要用来做数据归档,但是它并不具备崩溃恢复的能力,也就是说如果你的系统突然崩溃,重启后可能会有部分数据丢失,而redo log的存在则可以完美解决这个问题。

redo log记录的是对数据页更改的物理日志,比如类似「将第8页、第1行、第6个位置改成666」这种

  • 功能不同,binlog主要用于归档,而redo log主要用于崩溃恢复

  • 内容不同,binlog是逻辑日志,而redo log是物理日志

  • 写入时机不同,binlog是server层记录的,所有存储引擎可共享,而redo log是InnoDB引擎特有的

  • 写入方式不同,binlog容量无限,追加写入,而redo log容量有限,循环写入

补充:

1.MVCC手段只适用于Msyql隔离级别中的读已提交(Read committed)和可重复读(Repeatable Read).

2.Read uncimmitted由于存在脏读,即能读到未提交事务的数据行,所以不适用MVCC.

原因是MVCC的创建版本和删除版本只要在事务提交后才会产生。

3.串行化由于是会对所涉及到的表加锁,并非行锁,自然也就不存在行的版本控制问题。

4.通过以上总结,可知,MVCC主要作用于事务性的,有行锁控制的数据库模型。

Undo log是MySQL Innodb引擎的日志的一种,记录了老版本的数据。 
Undo log是Innodb MVCC重要组成部分,InnoDB的MVCC就是基于Undo log实现的。

当我们对数据进行操作的时候,就会产生undo记录,Undo记录默认记录在系统表空间(ibdata)中,从MySQL 5.6开始,Undo使用的表空间可以分离为独立的Undo log文件

https://blog.csdn.net/w2064004678/article/details/83012387

https://blog.csdn.net/linshenyuan1213/article/details/81948964