• java面试一日一题:binlog undolog redolog的区别


    问题:请讲下mysql中binlog、undolog、redolog三种日志的区别

    分析:mysql中这三种日志很常见,也是面试中涉及比较多的方面,要理解清楚这三种日志的定位及区别;

    回答要点:

    主要从以下几点去考虑

    1、三种日志的作用分别是什么;

    2、三种日志解决的问题;

    3、三种日志分别是什么时间写入的;

    bin log、redo log、undo log三种日志属于不同级别的日志,按照mysql的划分可以分为服务层和引擎层两大层,bin log是在服务层实现的;redo log、undo log是在引擎层实现的,且是innodb引擎独有的,主要和事务相关。

    bin log

    bin log中记录的是整个mysql数据库的操作内容,对所有的引擎都适用,包括执行的DDL、DML,可以用来进行数据库的恢复及复制。bin log有三种形式:statement、row、mixed,statement是基于语句的,也就是执行的sql语句,该种形式的文件比较小,例,update t1 set age='24' where name like '%王%',这样一条语句,在statement下就会记录这样一条sql;row是基于数据行的,会记录变化的所有数据,一般文件较大。例,update t1 set age='24' where name like '%王%',这条语句,在row的形式下,则会记录该条sql影响的所有数据记录;mixed是混合格式,是statement和row的组合;

    redo log

    redo log中记录的是要更新的数据,比如一条数据已提交成功,并不会立即同步到磁盘,而是先记录到redo log中,等待合适的时机再刷盘,为了实现事务的持久性

    undo log

    undo log中记录的是当前操作中的相反操作,一条insert语句在undo log中会对应一条delete语句,update语句会在undo log中对应相反的update语句,在事务回滚时会用到undo log,实现事务的原子性,同时会用在MVCC中,undo中会有一条记录的多个版本,用在快照读中;

    上面大体讲了三种日志的作用及背景和解决的问题,有个问题一直困扰着我,那就是在执行一条sql时,这三种日志是什么时间写入的。

    首先,一个事务刚开始,为了防止事务提交前回滚,要先写入undo log,只有写入了undo log才有可能实现回滚,又由于可能出现回滚所以开始写入的只有undo log;

    其次,在写入undo log后,要写入redo log中,这里的redo log指的是redo log buffer,而不是redo log file,至于什么时候redo log buffer中的内容会刷到磁盘mysql提供了一个配置参数innodb_flush_log_at_trx_commit,该参数有0 1 2三种取值,;

    最后,写入了redo log后,事务会处于prepare阶段,这时会告诉执行器随时都可以提交事务,执行器便会生成binlog日志,并写入磁盘,调用innodb的事务提交接口,进行事务提交,prepare状态的redo log也会进入commit状态,根据配置的innodb_flush_log_at_trx_commit的值是否把redo log buffer中的内容刷到磁盘;

    下面总结了三种日志的写入顺序,请参考,有不当之处欢迎留言,

    参考:https://www.cnblogs.com/klvchen/p/10861850.html

    https://www.cnblogs.com/klvchen/p/10861850.html

    一个爱写文章的程序员,欢迎关注我的公众号“北漂程序员”。我有故事,你有酒吗
  • 相关阅读:
    STL中的string
    STL中的map
    STL中的set和multiset
    C++基础知识
    希尔排序
    桶排序
    归并排序
    堆排序
    数组左边奇数右边偶数算法O(n)
    背包问题 洛谷P1164 小A点菜
  • 原文地址:https://www.cnblogs.com/teach/p/14730608.html
Copyright © 2020-2023  润新知