美文网首页mysql那些事儿
第七节、重要的日志模块(redo log)

第七节、重要的日志模块(redo log)

作者: 小母牛不生产奶 | 来源:发表于2018-12-23 15:55 被阅读13次

    什么是binlog、redo log

    binlog属于逻辑日志,是逻辑操作;

    innodb redo属于物理日志,是物理变更。

    逻辑日志有个缺点是难以并行,而物理日志可以比较好的并行操作。

    1. binlog是MySQL Server层记录的日志, redo log是InnoDB存储引擎层的日志。 两者都是记录了某些操作的日志(不是所有)自然有些重复(但两者记录的格式不同)。

     2. 选择binlog日志作为replication 

    重要的日志模块(redo log)

    在mysql中,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。为了解决这个问题,mysql的设计者就用了类似酒店掌柜粉板的思路来提升更新效率。

    mysql中经常说到的WAL技术,WAL的全称是Write-Ahead Logging ,它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本。

    具体来说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成 了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。

    redo log实现分析

    InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下图:

    示意图 名词解释

    Redo log

    记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是RedoLog已经持久化。系统可以根据RedoLog的内容,将所有数据恢复到最新的状态。

    InnoDB有buffer pool(简称bp)。bp是数据库页面的缓存,对InnoDB的任何修改操作都会首先在bp的page上进行,然后这样的页面将被标记为dirty并被放到专门的flush list上,后续将由master thread或专门的刷脏线程阶段性的将这些页面写入磁盘(disk or ssd)。这样的好处是避免每次写操作都操作磁盘导致大量的随机IO,阶段性的刷脏可以将多次对页面的修改merge成一次IO操作,同时异步写入也降低了访问的时延。然而,如果在dirty page还未刷入磁盘时,server非正常关闭,这些修改操作将会丢失,如果写入操作正在进行,甚至会由于损坏数据文件导致数据库不可用。为了避免上述问题的发生,Innodb将所有对页面的修改操作写入一个专门的文件,并在数据库启动时从此文件进行恢复操作,这个文件就是redo log file。这样的技术推迟了bp页面的刷新,从而提升了数据库的吞吐,有效的降低了访问时延。带来的问题是额外的写redo log操作的开销(顺序IO,当然很快),以及数据库启动时恢复操作所需的时间。


    Undo Log

    Undo Log是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用UndoLog来实现多版本并发控制(简称:MVCC)。

    -事务的原子性(Atomicity)

    事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。

    相关文章

      网友评论

        本文标题:第七节、重要的日志模块(redo log)

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