sql执行更新语句流程**
企业微信截图_16006896392111.png

Buffer Pool

Buffer Pool是一个缓冲池,这里面会缓存很多的数据,以便于以后在查询的时候,万一你要是内存缓冲池里有数据,就可以不用去查磁盘了

undo日志文件

为了考虑到未来可能要回滚数据的需要,这里会把你更新前的值写入undo日志文件

Redo Log Buffer

把对内存所做的修改写入到一个Redo Log Buffer里去,这也是内存里的一个缓冲区,是用来存放redo日志的
这个redo日志其实是用来在MySQL突然宕机的时候,用来恢复你更新过的数据的

MySQL宕机了怎么办

1.没提交事务
内存里Buffer Pool中的修改过的数据都丢失,同时你写入Redo Log Buffer中的redo日志也会丢失。磁盘上的数据依然还停留在原样子,mysql重启之后,你会发现你的数据并没有任何变化
2.事务已提交
根据一定的策略把redo日志从redo log buffer里刷入到磁盘文件里去;innodb_flush_log_at_trx_commit
值为0:
当这个参数的值为0的时候,那么你提交事务的时候,不会把redo log buffer里的数据刷入 磁盘文件的,此时可能你都提交事务了,结果mysql宕机了,然后此时内存里的数据全部丢失
值为1:
你提交事务的时候,就必须把redo log从内存刷入到磁盘文件里去,只要事务提交成功,那 么redo log就必然在磁盘里了,mysql重启之后,他可以根据redo日志去恢复之前做过的修改, 数据不会丢失
值为2:
提交事务的时候,把redo日志写入磁盘文件对应的os cache缓存里去,而不是直接进入磁盘文 件,可能1秒后才会把os cache里的数据写入到磁盘文件里去。丢失1秒的数据

binlog

redo log,他是一种偏向物理性质的重做日志,因为他里面记录的是类似这样的东西,“对哪个
数据页中的什么记录,做了个什么修改”。而且redo log本身是属于InnoDB存储引擎特有的一个东西。

而binlog叫做归档日志,他里面记录的是偏向于逻辑性的日志,类似于“对users表中的id=10的一行数据做了更新操作,更新以后的值是什么
binlog不是InnoDB存储引擎特有的日志文件,是属于mysql server自己的日志文件。
binlog的刷盘策略
有一个sync_binlog参数可以控制binlog的刷盘策略
默认值0:此时你把binlog写入磁盘的时候,其实不是直接进入磁盘文件,而是进入os cache内存缓存
值为1:此时会强制在提交事务的时候,把binlog直接写入到磁盘文件里去

最后一步在redo日志中写入commit标记的意义是什么

说白了,他其实是用来保持redo log日志与binlog日志一致的。
必须是在redo log中写入最终的事务commit标记了,然后此时事务提交成功,而且redo log里有本次更新对应的日志,binlog里也有本次更新对应的日志 ,redo log和binlog完全是一致的。