MySQL实战02の一条更新语句怎么执行的

更新语句执行过程大致与查询过程相似

WAL技术,write-ahead logging,先写日志再写磁盘

binlog(归档日志)
Server层自己的日志,Binlog有两种模式,statement 格式是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。

redo log(重做日志)
InnoDB引擎特有的日志,拥有crash-safe能力(即使数据库发生异常重启,之前提交的记录也不会丢失)。
两阶段提交:保证两份日志之间的逻辑一致(反证法)
1. 引擎将行数据更新到内存,同时将更新操作记录到redo log中,此时redo log处于prepare状态。然后告知执行器执行完了,随时可以提交事务。
2. 执行器生成这个操作的binlog,写入磁盘
3. 执行器调用引擎的提交事务接口,引擎把redo log改成提交状态commit,更新完成。
不同点
1. redo log是InnoDB特有的;binlog是Server层实现的,所有引擎可以用。
2. redo log是物理日志,记录“在某个数据页做了什么修改”;binlog是逻辑日志,记录语句的原始逻辑。
3. redo log是循环覆盖写的,空间固定会用完;binlog是追加写,写完一个切换写下一个,不会覆盖以前的日志。

原文出处:https://time.geekbang.org/column/article/68633

总结:

理解两种日志的不同点和用途,两阶段提交

原文地址:https://www.cnblogs.com/yangjiming/p/10314392.html