一条更新语句的执行过程和查询语句相似,更新的流程涉及两个日志:redo log(重作日志)和binlog(归档日志)。好比咱们要将ID(主键)=2这一行的值加(c:字段)1,SQL语句以下:sql
update T set c=c+1 where ID=2;
重作日志是InnoDB引擎特有的,是物理日志,记录在“某个数据页上作了什么修改“。大小是固定,能够进行配置大小。假如咱们配置一组4个文件,图中write pos是当前记录的位置,日后推移而且循环;checkpoint是当前要擦除的位置,移动规律和前者同样。二者之间的位置能够记录新的操做。数据库
若是write pos 追上checkpoint,就移动checkpoint擦除一些记录。因此即便数据能够发生异常重启,InnoDB也能够保证以前提交的记录不会丢,这就是MySQL的crash_safe能力。spa
归档日志是MySQL的server层的实现的,全部引擎均可以使用。binlog记录的是sql语句的原始逻辑,好比根剧'id'字段查询全部的信息;相比redo log的循环写入,binlog是追加写的,binlog文件写到必定大小后会切换到下一个,不会覆盖之前的日志。日志
Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。code
文章开头的更新语句在InnoDB中的执行流程以下:深色表明在执行器中执行的,浅色是在存储引擎中。server
最后写入redolog分为了prepare和commit两步,用来保证两个日志写入的一致性,这就是“两阶段提交”。好比咱们执行“update T set status = 1“时:blog
总的来讲binlog记录了对数据库全部的逻辑操做,能够经过binlog来备份出一份彻底相同的库;由于redolog是InnoDB引擎特有的,若是使用其余引擎,那么就要依赖binlog来记录操做。事务
Q:按期全量备份的周期“取决于系统重要性,有的是一天一备,有的是一周一备”。那么在什么场景下,一天一备会比一周一备更有优点呢?或者说,它影响了这个数据库系统的哪一个指标?it
A:一天一备,那么若是须要恢复数据的话,只要保证当天的binlog完整便可;一周一备的话就要保证一周的binlog完整;同时频繁全量备份须要更多存储空间,如何选择取决于业务的重要性,对应的指标是RTO(目标恢复时间)。class
-- 《MySQL实战45讲》笔记二