MySQL的日志模块

MySQL的持久化能力很是强大,它能够恢复到两周内任意一秒的状态。像查询所须要执行的一套流程,更新也会再执行一次。若是不知道,能够看这里..net

MySQL的底层机制指针

可是更新操做会牵扯到日志模块,这里的日志是redo log与bin log。也就是咱们常说的重作日志和归档日志。日志

目录blog

redo log资源

bin logget


redo log

在MySQL里,若是每一次更新操做都要先查询再更新,这样它所须要耗费的资源是至关高的,这样会让整个IO成本与查询成本都会很高,并且效率很是“感人”。因此这时候,它并非先查找再更新的,而是每次先把更新的语句写到日志里,而后等空闲的时候再去查询,而后更改。it

这里所用的技术就是WAL(Whitr-Ahead Log)技术,它就是先写日志,而后再写磁盘。当你执行一条更新语句的时候,InnoDB首先会去将这条语句记录在redo log中,等在系统闲置的时候再去将整条操做更新到磁盘。效率

若是某次更新操做特别多,应该怎么办?InnoDB的redo log是固定大小的,可是它能够配置几组文件,而后从头开始写,写到末尾再重头开始写。就至关因而一条链表,而后设立指针联动。最早开始动的指针进行写操做,后面的指针进行擦除操做,也就是将这条操做更新到磁盘里面。当快指针把最后一个节点写完以后,再从新回到头结点,而后从新开始。配置

这样,哪怕InnoDB引擎不当心重启的话,它里面也不会丢失数据。这种操做是crash-safe。循环

bin log

前面讲的redo log是属于存储引擎层,而这里的bin log则是属于Service层的日志。在之前,MySQL的存储引擎不是InnoDB而是MyISAM,这种存储引擎并无redo log,而只有bin log。若是说redo log是一种物理操做,那么bin log就是一种逻辑操做。它记录的是这个语句的原始逻辑。redo log是循环写的,就像一块黑板,就那么大,写完了就擦了之前写的东西而后继续写。而bin log能够理解为一个本子,写完了一张翻过一张继续写。