我正在参加「掘金·启航计划」
1.简单图解
2.解析
-
innodb 有一个 buffer pool 的概念,会从磁盘中缓存一部分数据
-
首先会根据 id = 1 在 pool中进行查找,看这条数据是否存在,如果存在就会将其加锁,若不存在会将其缓存到 buffer pool 中
-
将查到的记录的原值写到 undo log 文件中,便于事务失败等进行的回滚操作,这里假设我们 id = 1 的数据 name = 'zhangsan',undo log 中便会记录,便于以后的回滚
-
然后会讲我们要更新的值,更新缓存,然后将更新的值写入到 redo log buffer 中,注意这时只是修改了缓存中的值,并没有修改磁盘的值,此时数据属于脏数据
-
最后我们会提交事务,根据 innodb_flush_at_tix_commit 的参数值来判断如何处理 redo log buffer
-
若值为 0 :不进行刷盘处理,此时若MySQL 宕机,那么日志会丢失,数据也还是之前的
-
若值为 1 :会进行刷盘操作,让 redo log buff 中的内容写入到磁盘中
-
若值为 2 :会将 redo log buffer 的内容写入到 os cache 中,若这时机器宕机,还是会有数据丢失的风险
-
3.刷盘策略
通常我们会讲刷盘策略设置为 1
也就是说我们每次进行事务提交的时候,都将 redo log 写入到磁盘中,因为有 redo log 的存在,系统恢复的时候可以根据日志文件来进行数据的恢复;
如果要是选择0,可能提交事务之后,系统宕机了,那么此时 redo log 也没有进入磁盘,那么这时你的数据可能就丢失了
对于数据库这样严格的系统来说,一般建议设置为1,保证数据不丢失