mysql-log

作者: 甜甜起司猫_ | 来源:发表于2021-06-28 08:16 被阅读0次

    mysql-log

    redo log

    数据库事务提交后,必须将更新后的数据刷到磁盘上,以保证ACID特性。磁盘随机写性能较低,如果每次都刷盘,会极大影响数据库的吞吐量。

    优化方式是,将修改行为先写到redo日志里(此时变成了顺序写),再定期将数据刷到磁盘上,这样能极大提高性能。

    假如某一时刻,数据库崩溃,还没来得及刷盘的数据,在数据库重启后,会重做redo日志里的内容,以保证已提交事务对数据产生的影响都刷到磁盘上。

    一句话,redo日志用于保障,已提交事务的ACID特性。

    undo log

    数据库事务未提交时,会将事务修改数据的镜像(即修改前的旧版本)存放到undo日志里,当事务回滚时,或者数据库奔溃时,可以利用undo日志,即旧版本数据,撤销未提交事务对数据库产生的影响。

    insert undo log和update undo log分别存放在不同的buffer里。

    一句话,undo日志用于保障,未提交事务不会对数据库的ACID特性产生影响。

    rollbacl segment 回滚段

    存储undo日志的地方,是回滚段。

    undo日志和回滚段和InnoDB的MVCC密切相关。


    • redo log 是innodb引擎产生的,主要用于支持MySQL事务,MySQL会先写redo log,而后在写binlog。redo log可以保证即使数据库异常重启,数据也不会丢失
    • undo log 是innodb引擎产生的,主要时候用于解决事务回滚和MVCC。数据修改的时候,不仅记录redo log,也会记录undo log。在事务执行失败的时候,会使用undo log进行回滚;
    • binlog 主要用于复制和数据恢复,记录了写入性的操作。binlog分成基于语句,基于行和混合模式三种复制模式。

    (扩展点1,阐述两阶段提交) 因为redo log生成到binlog写入之间有一个时间差,所以为了保证两者的一致性,MySQL引入了两阶段提交:

    1. Prepare阶段,写入redo log;
    2. Commit阶段,写入binlog,提交事务;

    (扩展点2,阐述一下的刷盘时机)

    binlog 刷盘可以通过sync_binlog参数来控制。

    1. 0-系统自由判断,
    2. 1-commit刷盘,
    3. N-每N个事务刷盘

    redo log刷盘可以通过参数innodb_flush_log_at_trx_commit控制。

    1. 0-写入log buffer,每秒刷新到盘;
    2. 1-每次提交;
    3. 2-写入到OS cache,每秒刷盘;

    相关文章

      网友评论

          本文标题:mysql-log

          本文链接:https://www.haomeiwen.com/subject/miyfultx.html