????????更新语句执行的流程和查询语句执行的流程一样
????????
????????注意:
????????在一个表上有更新的操作的时候,和这个表相关的查询缓存就会被清空
?
????????在经历分析器,优化器,和执行器存储引擎的历程中,还多了重要的日志模块
????????Redo log 重做日志
????????Bin log 归档日志
????????
????????????是innodb 引擎独有的日志模块
?
它的关键点就是更新的时候先写日志,再写磁盘,在任务不忙的时候将大量的积累更新操作一块儿进行IO写入磁盘
?
InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块"粉板"总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示
write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
?
write pos和checkpoint之间的是"粉板"上还空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,表示"粉板"满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。
?
有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
?
?
????????是service层日志模块
????????所有引擎都可以用
????????Binlog以追加的方式记录逻辑操作 是由执行器生成的
?
????????为什么会有两份日志模块?
因为最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM,但是MyISAM没有crash-safe的能力,binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力
?
两种日志特点对比:
?
?
?
?
?
?
?
?
执行流程图,
图中浅色框表示是在InnoDB内部执行的,
深色框表示是在执行器中执行的
????????重点:
????????Binlog 的完成在redolog 的prepare和commit之间
????????在binlog之前 redolog已经准备好在内存中,但是未写入磁盘
????????在binlog之后 redolog 才处于提交状态准备写入磁盘。
????????Redolog 和binlog是两个独立的阶段,并不依赖
????????
????????即,数据已经在内存中修改完毕,修改数据的操作也记录完了,
但是数据库的磁盘文件还没有真正写入。
?
?
注意
redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失。
?
sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数建议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。
?
?
?
?
????????
????????
原文:https://www.cnblogs.com/binyang/p/11260126.html