zoukankan      html  css  js  c++  java
  • 重要的日志模块--redolog和binlog

    redolog和binlog?作用?

    MySQL两个重要的日志模块。我们知道MySQL可以分成Server层和存储引擎层两部分,Server层主要做的是MySQL功能层面的事情,存储引擎层负责数据的存储和提取。

    redo log(重做日志)是InnoDB引擎特有的,有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe(崩溃安全恢复)。

    binlog(归档日志)是MySQL的Server层实现的,所有引擎都可以使用,用于归档。

    为什么会有两份日志呢?

    因为最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM,但是MyISAM没有crash-safe(崩溃安全恢复)的能力,binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统— — 也就是redo log来实现crash-safe能力。

    redolog与binlog区别?

    这两种日志有以下三点不同。

    1. redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。

    2. redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。

    3. redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

    WAL技术?

    WAL的全称是WriteAhead Logging,它的关键点就是先写日志,再写磁盘。

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

    由来?

    在MySQL中,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到

    对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。为了解决这个问

    题,MySQL的设计者就使用WAL技术来提升更新效率。

    redo log原理

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

    write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

    write pos和checkpoint之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    mongodb 数据库操作--备份 还原 导出 导入
    括号匹配算法求解(用栈实现)
    最短路径(图中两点间最短路径)
    城市之间的最短总距离(最小生成树算法)
    简单的约瑟夫环算法
    动态数组排序实例
    折半查找算法
    对字符串进行快速排序(即字符数组排序)
    字符串数组排序的快速排序实现
    插入排序反序排序
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/15085476.html
Copyright © 2011-2022 走看看