声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。
UPDATE t SET name = jack WHERE id = 1
这是一个简单的更新语句,它会如同查询语句一样,经过流程,连接器,分析器,优化器,执行器。它首先会查看内存中是否有 id为1的数据 如果有的话,那么就会更新返回。更新操作会清除该条记录的缓存
1.WAL 技术
WAL他的全称 WRITE-Ahead Logging,他的特点就是 先记录日志,再写磁盘。
2.日志模块
MYSQL的日志分为两个方面。
server层: binlog日志(归档日志)binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
引擎层: redo log 是 InnoDB 引擎特有的,redo log 是物理日志,记录的是“在某个数据页上做了什么修改”
2.1为什么要两份日志呢?
InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。
3.如何实现 crash-safe
crash-safe 就是 即使数据库发生异常重启,提交过的记录都不会丢失。具体实现是通过 redo-log的两段提交协议。记录日志的过程是:
1.记录redo log 处于 prepare状态
2.记录binlog 写入磁盘
3.redo改成 commit状态,更新完成
1 prepare阶段 2 写binlog 3 commit
当在2之前崩溃时
重启恢复:后发现没有commit,回滚。备份恢复:没有binlog 。
一致
当在3之前崩溃
重启恢复:虽没有commit,但满足prepare和binlog完整,所以重启后会自动commit。备份:有binlog. 一致