对于任何一位使用mysql的开发人员来说,稍微有点深入的应该都会接触到这两个名词。
区别:
1.redo log只有innodb引擎才有。
2.redo log关键点是先写日志,在写磁盘,等到某个不忙的时间段再统一写入磁盘。并且有大小如果超过了就暂停写入日志并擦除一些记录,但在擦除之前会写入文件,这样即使服务器异常重启,也不会丢失提交的记录。而binlog是一种日志归档,它记录了你的“逻辑操作”,例如会记录 “你在某个点更新了什么数据”,binlog是用来数据恢复的重要手段。
3.redo log是引擎层面的产物;binlog是mysql的server层的产物,所以引擎都可以使用。
4.redo log是循环写的,空间固定会用完。而binlog是追加写入的,在写满一个日志文件后会创建一个新的文件继续写入。
对于一个普通的更新操作,可以从以下过程看看如何执行的,例如:
update user set sex=1 where id=2
1、首先SQL的该有的验证,权限验证、词法解析、语法验证、优化器都会走。
当优化器执行完后,判断id是主键,于是去索引树找到这一行。如果这条数据结果在内存中,就直接返回,否则需要从磁盘读入内存再返回。
2、执行器拿到这行数据的值,给设置为1,再调用引擎的接口写入这行数据。引擎将这行新数据更新到内存中,同时将这次的操作记录保存在redo log中,此时redo log处于预处理状态。
3、 执行器将这次的改动存到磁盘里的binlog。
4、执行器调用引擎的提交事务接口,并把redo log的状态改为commit,更新完成。
这里需要记住redo log是innodb引擎的,binlog是mysql的server层的,这样就容易理解多了。
关于binlog,可以看看这篇博客 www.cnblogs.com/Presley-lpc/p/9619...