ps:查询语句的那一套流程,更新语句也是同样会走一遍
mysql更新涉及到日志模块
- redo log(重做日志)
- binlog(归档日志)
redo log
每一次更新只更新内存,并写入redo log,如果每次更新都需要更新磁盘,涉及到随机IO,性能过差,采用预写日志技术(WAL:Write-Ahead Logging),redo log写满了,会停下来写redo log,将redo log的数据刷到磁盘。
redo log图解
- write pos 是当前记录的位置
- checkpoint 是当前要擦除的位置
有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe
binlog
redo log 是 InnoDB 引擎特有的日志,而 Server 层也有自己的日志,称为 binlog(归档日志)
两种日志的不同
- redo log 是InnoDB特有的;binlog是mysql Server层的,所有存储引擎都有
- redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”
- redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志
update语句执行流程
图中浅色框表示是在 InnoDB 内部执行的深色框表示是在执行器中执行的
两阶段提交
inlog 会记录所有的逻辑操作,并且是采用“追加写”的形式。如果你的 DBA 承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有binlog,同时系统会定期做整库备份。这里的“定期”取决于系统的重要性,可以是一天一备,也可以是一周一备。目前我司是开启aliyun配置每天自动备份
文章笔记来自极客时间《MySQL实战45讲》