讲redolog和binlog之前,先要讲一下一条mysql语句的执行过程。

1、client的写请求到达连接器,连接器负责管理连接、验证权限;

2、然后是分析器,负责复习语法,如果这条语句有执行过,在缓存内,那么就从缓存去写;

3、缓存没有的话,那就到了优化器部分。负责优化sql读写,选择索引;

4、接下来是执行器,负责操作引擎,并返回结果。

接下来就要进入正题,说一下第四步是如何执行的。

redo log

与查询不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和bin log(归档日志)。

innodb的更新操作不是直接写入磁盘的,而是先记录日志,也就是redo log,然后等到db没那么忙碌的时候刷到磁盘上。这样保证了mysql的高效写操作。为什么会这么设计呢?因为每次更新操作先要查询,这里有磁盘io,查到后修改数据,刷入磁盘,又是一次io,每次都这样做的话会非常慢,所以就先记录在内存中,然后记录在redo-log中,然后按照策略刷入磁盘。这个技术叫做WAL技术。因为如果只记录在内存中的话,mysql崩溃会导致改动的数据丢失。所以redo log保证了innodb的crash-safe。(注意:mysql是没有redo log的,它是innodb特有的。不过现在mysql大部分情况下都会选用innnodb。)mysql crash后,故障恢复会从redo log中读取数据。

不过redo log是有大小限制的,比如设置了4个1G的redo log,那么第3个写满的时候会覆盖第0个的log文件。

bin log

redo log是在存储引擎层面的日志,负责存储和crash恢复。bin log 是server层的日志。

为什么会有两份日志呢?

因为只依靠bin log是没有crash safe能力的。而且redo log是有大小限制的。

redo log和bin log主要有如下几个区别:

1、所属层不一样,bin log是server层,redo log是存储层的日志,只有innodb才有。

2、redo log有大小限制,是循环写的,而binlog没有这样的限制;

3、redo log是物理日志,记录的是“在某个数据页上做了什么修改”,bin log是逻辑日志,记录的是语句的原始逻辑,比如给id=3的这一行的count做加一操作。

接下来看一下一条update语句的执行过程:

1、首先查到这一行或者多行数据;

2、然后修改数据,写入内存,并将修改写入redo log,此时redo log处于prepare阶段,并告诉执行器可以提交了;

3、返回ok给server的执行器,执行器收到ok后在binlog中记录原始语句,写入磁盘;

4、binlog记录完成后,执行器告诉引擎层,引擎层将对应的redo log从prepare状态改成commit状态。

这就是2PC。

如果我们要将数据库恢复到某一个时刻点,比如本周二,那么找到周二前最近的全量备份,然后执行备份时间到本周二的binlog,得到一个临时的数据库。

可不可以不要做两阶段提交,而改成把这两步操作独立做呢?可以考虑一下如下两个场景(把某一行的count列从0改成1):

1、先做redo log,后写bin log

如果先写redo log成功后,还没写binlog就崩了,此时count列已经变为1,而数据恢复时,用的是bin log,bin log里少了这一个操作,那么就出现用bin log恢复出来的db和当前的db比,出现了不一致。

2、如果先做bin log,然后写redo log

如果写完bin log后,redo log还没写,就崩了,也就是说崩溃时的db是没有count=1这个修改的。而用bin log恢复出来的db里是有这行记录的,那么也出现了不一致。

所以,update时针对redo log和bin log做2PC还是很有必要的。

此外。redo log有个配置项innodb_flush_log_at_trx_commit设置成1,保证每次事务后时redo log都能更新到磁盘。这样就不会出现丢失的现象。

innodb_flush_log_at_trx_commit=0表示每秒写入磁盘。这样有可能最多丢失1秒钟的数据。

设置为2时,表示每次事务后将redo log的缓存写入os buffer,然后是每秒调用fsync()将os buffer中的日志写入到log file on disk。这样的话,如果系统崩了会丢失一秒的数据,如果mysql崩了,则不会丢失数据。

sync_binlog也建议设置成1,表示每次事务后的binlog会持久化到磁盘,这样可以保证mysql异常重启后的binlog不会丢失记录。

最有有个问题,写日志也是写磁盘,直接更新数据也是写磁盘,都是写磁盘,效率不是一样的吗?这样innodb的redo log不是多此一举吗?因为redo log是追加的形式写磁盘,所以效率很高,而修改数据库的数据是随即写,效率就低了很多。

redo log和bin log的更多相关文章

  1. 【Mysql】三大日志 redo log、bin log、undo log

    @ 目录 redo log(物理日志\重做日志) binlog(逻辑日志/归档日志) update语句执行流程 Uodolog(回滚日志/重做日志) undo log+redo log保证持久性 re ...

  2. 深入学习MySQL 02 日志系统:bin log,redo log,undo log

    上一篇文章中,我们了解了一条查询语句的执行过程,按理说这篇应该讲一条更新语句的执行过程,但这个过程比较复杂,涉及到了好几个日志与事物,所以先梳理一下3个重要的日志,bin log(归档日志).redo ...

  3. MySQL日志系统bin log、redo log和undo log

    MySQL日志系统bin log.redo log和undo log   今人不见古时月,今月曾经照古人. 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,主要包括错误日 ...

  4. bin log、redo log、undo log和MVVC

    logs innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过 ...

  5. MySQL中的redo log和undo log

    MySQL中的redo log和undo log MySQL日志系统中最重要的日志为重做日志redo log和归档日志bin log,后者为MySQL Server层的日志,前者为InnoDB存储引擎 ...

  6. MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...

  7. Oracle 11g的Redo Log和Archive Log的分析方法

    自Oracle 11g起,无需设置UTL_FILE_DIR就可以使用LOGMNR对本地数据库的日志进行分析,以下是使用LOGMNR的DICT_FROM_ONLINE_CATALOG分析REDO和归档日 ...

  8. 详细分析MySQL事务日志(redo log和undo log)

    innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...

  9. 详细分析MySQL事务日志(redo log和undo log) 表明了为何mysql不会丢数据

    innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...

随机推荐

  1. Linux记录-批量安装ssh(转载)

    首先,需要检查expect是否安装:rpm -qa|grep expect 然后,在操作机上创建公钥:ssh-keygen 一路回车即可 创建好之后到/root/.ssh/下就可以看到id开头的2个文 ...

  2. 用KNN实现iris的4分类问题&测试精度

    import matplotlib.pyplot as plt from scipy import sparse import numpy as np import matplotlib as mt ...

  3. 细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,文章结尾处的一些扩展有一定实战意 ...

  4. .net core 使用SignalR实现实时通信

    这几天在研究SignalR,网上大部分的例子都是聊天室,我的需求是把服务端的信息发送给前端展示.并且需要实现单个用户推送. 用户登录我用的是ClaimsIdentity,这里就不多解释,如果不是很了解 ...

  5. 代码内存泄露检测(1) MLeaksFinder (Wechat开源) + FBRetainCycleDetector (FaceBook开源)

    每次项目编译完成之后,都被内存搞得头昏脑胀,压力甚大. 利用两周时间,稍微研究了 微信开源的 MLeaksFinder 和 facebook 开源的 FBMemoryProfiler, 这两个开源三方 ...

  6. nginx配置访问本地静态资源

    下面说说如何在windows下使用nginx作为静态资源服务器, 1.修改config目录下,这个配置文件,基本上所有的配置都在这里面做, 2.主要的配置参数如下,一些无关的参数我直接去掉了,注意,里 ...

  7. 一次性清除页面上的所有setInterval

    参考链接:https://www.cnblogs.com/liujinyu/p/3668575.html

  8. git使用安装

    下载地址 http://msysgit.github.io/ 配置个人的用户名称和电子邮件地址: $ git config --global user.name "runoob" ...

  9. mysql数据表的编辑

    创建数据表 create  table  [if not  exists] 表名(字段列表, [约束或索引列表]) [表选项列表]; 删除数据表 drop   table  [if  exists] ...

  10. R去掉含有NA的行

    只要数据框中含有NA的行都去掉 final[complete.cases(final),] na.omit(final) 过滤某几列 final[complete.cases(final[,5:6]) ...