更新流程与查询流程是一样的。
此外,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和 binlog(归档日志)。
- 重要的日志模块:redo log(物理日志)
redo log 是 InnoDB 引擎特有的日志。
redo log 用于保证 crash-safe 能力。
MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。 - 重要的日志模块:binlog(逻辑日志)
Server 层也有自己的日志,称为 binlog(归档日志)。
MySQL官方文档--The Binary Log
这两种日志有以下三点不同。
- redo log 是 InnoDB 引擎特有的;
binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 - redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。 - redo log 是循环写的,空间固定会用完;
binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
两阶段提交
写日志步骤:
- 写入redo log,处于prepare状态;
- 写binlog;
- redo log提交事务,处于commit状态;
将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。
redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。
参考:
极客时间--《MySQL 实战 45 讲 -- 02 日志系统》--林晓斌
MySQL官方文档--The Binary Log
网友评论