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
总结:
理解两种日志的不同点和用途,两阶段提交