MySQL的两个日志系统

MySQL中有两个重要的日志模块,分别是redo log(重作日志)和binlog(归档日志)。当咱们学习MySQL的时候,这两部份内容是绕不开的,本文我未来详细的介绍一下这两个日志模块,它们在设计上有不少好玩的地方,一些思想也能够在咱们工做中使用。数据库

redo log

这里咱们举个例子,好比饭店掌柜有个小黑板,专门用来记录客人的赊帐记录,若是赊帐的人很少,那么他就能够把顾客名字和帐目写在小黑板上,若是赊帐的人不少,小黑板总会记不下的时候,这个时候掌柜的就须要一个专门记录赊帐的帐本。ide

若是有人又要赊帐的时候,掌柜就有两种作法:学习

  • 一种是直接翻开帐本找到这个顾客的记录,把此次赊的账加上去或者划掉。spa

  • 另外一种就是先在黑板上记录,等打烊或者不忙的时候再把帐本翻出来记录在帐本上。插件

在生意红火,柜台很忙的时候,掌柜确定选择第二种作法,由于第一种作法太麻烦了,每次都要翻阅帐本找到这我的的记录,帐本有不少页,找起来很是浪费时间,找到以后又要核算,整个过程想一想都麻烦,相比之下,先在黑板上记录就方便不少。设计

举上边这个例子是由于MySQL也有这个问题,若是每次更新操做都须要写进磁盘,而后磁盘也要先找到对应的那条数据,而后更新,整个过程IO成本、查找成本很高,为了解决这个问题,MySQL在设计的时候就用了相似饭店记帐的思路来提升更新效率。日志

其实就是MySQL里常说的WAL技术,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写小黑板,等不忙的时候再写帐本。orm

须要注意的是,先写日志的写日志,其实也是写磁盘,只是写日志是顺序磁盘,速度很是快。blog

具体的状况就是,当有一条记录须要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了,InnoDB引擎会在适当的时候,将这个操做记录更新到磁盘里面,而这个更新每每在系统比较空闲的时候作,就像打烊了之后写帐本同样。图片

同时,将赊帐记录在小黑板上,若是赊帐的很少,能够等打烊了之后再记录帐本,若是赊帐的特别多,小黑板写满了,这个时候掌柜就要放下手上的活,先把黑板上的部分赊帐记录更新到帐本上,而后将记录好的信息从小黑板上擦掉,为记录新的赊帐腾出地方。

MySQL于这个也是相似的,InnoDB的redo log是固定大小的,好比咱们能够分配一组4个文件,每一个文件的大小都是1GB,那么总共就能够记录4GB的操做,从头开始写,写到末尾就又从开头循环写,write pos是当前记录的位置,一边写一边后移,写到3号文件末尾后就回到0号文件开头,checkpoint是当前要擦除的位置,也是日后推移而且循环的,擦除记录前要把记录更新到数据库中。

图片

write pos和checkpoint之间的是“小黑板”上还空着的部分,能够用来记录更新的操做,若是write pos追上了checkpoint,表示“黑板“写满了,这个时候不能再执行新的更新,得停下先擦掉一些记录,把check point推动一下。

redo log是InnoDB引擎所特有的,因此咱们在使用InnoDB引擎建立表时,若是数据库发生异常重启,以前提交的记录都不会丢失,InnoDB就是由于有了redo log才有了crash-safe的能力。

crash-safe简单来说,就比如饭店掌柜的把赊帐记录在小黑板上或者帐本上,以后饭店忽然停业了几天,从新开业后,依然能够经过小黑板和帐本上的数据核算赊帐帐目,

binlog

上一篇文中,咱们在说MySQL总体来看,分为两部分,一部是Server层,主要作的是MySQL功能层面的事情,还有一部分是引擎层,负责存储相关的具体事情。上边说的redo log是InnoDB引擎特有的日志,而Server层的日志称为binlog。

这个地方为何要有两份日志,还要从最开始的时候MySQL中没有InnoDB引擎提及,当时MySQL自带的引擎是MyISAM,可是M有ISAM没有crash-safe的能力,binlog日志只能用来归档,而InnoDB是第三方公司以插件的形式引入MySQL的,由于只依靠binlog是没有crash-safe的能力,因此要使用InnoDB的日志系统redo log。

两种日志主要的不一样:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,全部引擎均可以使用

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

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

相关文章
相关标签/搜索