SQL更新语句也需要走server层的模块,最后到执行器,调用存储引擎的获取数据接口,把数据修改后,再调用存储引擎的写数据接口,把数据写回去。

    更新的SQL执行涉及到2个日志:binlog和redo log。
    binlog是MySQL server层的日志; redo log是innodb存储引擎的日志。

    binlog是逻辑日志,记录的是SQL语句或者行的数据,是一直追加的,日志文件到一定大小就开始新的文件。
    redolog是物理日志,记录的是在数据页上做的什么修改。redolog是先记录到内存,等空闲时在记录到磁盘,或者redo log区域写满了,也会触发更新到磁盘操作。
    redo log理论上是环形区域,有固定大小,有两个指针一个是当前写到的位置,一个是擦除的位置。redolog可是保证即使数据库异常重启,也不会丢失数据,这个能力叫做crash-safe

    为什么会有两份日志,因为MySQL最开始用的是myisam引擎,是没有日志的。binlog是MySQL server自己的日志,和引擎没有关系,binlog没有crash-safe能力,所以承innodb使用redolog来实现crash-safe。

    当一条数据更新,redo log 记录后会进入prepare状态,告诉server层可以随时提交了,当server层记录了binlog,在调用innodb提交事务的接口,引擎把日志改为commit状态。这就是两阶段提交,两阶段提交保证了两个日志的一致性。

    2 一条更新SQL是如何执行的 - 图1