MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志

执行一条语句的大概流程

MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第1张图片

InnoDB的重要内存结构:缓冲池

InnoDB存储引擎中有一个非常重要的放在内存里的组件,就是缓冲池,这里会缓存很多的数据,以便以后查询的时候,不用去查磁盘。
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第2张图片
引擎要执行更新语句的时候,eg更新"id=10"这一行数据,其实会先看"id=10"这一行数据看看是否在缓冲池中,如果不在的话,那么会直接从磁盘里加载到缓冲池,而且接着会对这条数据加一个独占锁。(不允许同时更新)

undo日志文件:用于回滚

如果我们执行一条更新语句,如果他是在一个事务里面的话,那么事务提交之前我们都是可以对数据进行回滚的;考虑到未来可能要回滚数据,更新的时候会先把值旧的值写入到undo日志文件中。
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第3张图片

更新buffer pool中的缓存数据

当我们要把更新的那行记录从磁盘文件加载到缓冲池,同时对他加锁之后,而且把更新前的值写入undo日志文件之后,我们就可以正式开始更新这行记录了,更新的时候,会先更新缓冲池中的记录,此时这个数据就是脏数据了。
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第4张图片

Redo Log Buffer:系统宕机,避免数据丢失

redo日志:用来记录你对数据做了什么修改(在内存中)
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第5张图片
redo日志是用来在mysql突然宕机的时候,用来恢复你更新过的数据的,redo日志仅仅停留在内存缓冲中。
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第6张图片
如果系统奔溃,redo日志的数据也会丢失,但是这个不要紧,因为更新一条数据,没提交事务,就代表他还没有成功,此时mysql宕机虽然导致内存的数据丢失,但是你会发现,磁盘的数据还是老样子。

提交事务的时候将redo日志写入磁盘中

如果我们先要提交一个事务了,就会根据一定的策略把redo日志从redo log buffer刷入磁盘文件中去。

  • 策略是通过innodb_flush_log_atr_trx_commit来配置的,
  • 当这个参数为0时,提交事务的时候,不会把redo log buffer里的数据刷到磁盘文件的,如果提交事务后,mysql宕机,此时内存中的数据全部丢失。

MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第7张图片

  • 当这个参数为1的时候,提交事务时,就必须把redo log从内存刷入到磁盘文件中,只要事务提交成功,那么redo log就必然在磁盘里了,
    -MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第8张图片
    提交事务之后,可能存在一种状态
    MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第9张图片
    如果系统奔溃重启,可以根据redo日志去恢复之前做过的修改:MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第10张图片
  • 该值为2时,提交事务的时候,把redo日志写入磁盘文件对应的os cache缓存里面去,而不是直接进入磁盘文件,可能1s之后才会把os cache里的数据写入到磁盘文件中里
    这种模式下,可能提交事务后,redo日志可能还没写入磁盘就宕机了,此时提交了事务,但是数据丢了。
    MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第11张图片
    ####### 通常建议设置为1,这样提交事务的时候,redo日志必须刷到磁盘文件中,这样数据才不会丢。

MYSQL binlog

  • redo log 是属于InnoDB存储引擎特有的东西,他是一种偏物理性质的重做日志。
  • binlog归档日志:是属于mysql server自己的日志文件
提交事务的时候,同时会写入binlog

MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第12张图片
在提交事务的时候,我们同时会把这次更新对应的binlog日志写入到磁盘文件中去

  • 执行器是一个非常核心的一个组件,负责跟存储引擎配合完成一个sql语句在磁盘与内存层面的全部数据更新操作。
binlog日志的刷盘策略分析

有一个sync_binlog参数可以控制binlog的刷盘策略,他的默认值为0,此时吧binlog写入磁盘的时候,其实不是直接进入磁盘文件,而是进入os cache内存缓存。(可能会丢失数据)
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第13张图片
如果sync_binlog参数设置为1的话,会强制在提交事务的时候,把binlog直接写入到磁盘文件中去,
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第14张图片

基于binlog和redo log完成事务的提交

当我们把binlog写入磁盘文件之后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里面的位置,都写入到redo log日志文件中去,同时在redo log日志文件里面写入一个commit标记。
在完成这件事情之后,才算最终完成事务的提交。
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第15张图片

写入commit标记的意义

保证redo log和binlog完全一直。

后台IO线程随机将内存更新后的脏数据刷回磁盘

如果我们已经提交了事务,他已经把内存中的buffer pool中的缓存的数据更新了,同时磁盘里有redo日志和binlog日志,都记录了我们指定的修改。
mysql有一个后台的IO线程,会在某个时间里,随机把内存buffer pool中的修改后的脏数据给刷回到磁盘上的数据文件里去。
MYSQL专题(二):初步了解一下InnoDB存储引擎,binlog日志_第16张图片
如果修改之前,系统宕机也没关系,因为redo日志恢复之前提交事务做过的修改到内存汇总去,然后等合适的时机,IO线程自然还是会把这个修改后的数据刷到磁盘上的数据文件里去。

你可能感兴趣的:(Mysql,mysql,数据库)