mysql一条sql更新过程。

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(归档日志)

两种日志的不同

  1. redo log 是InnoDB特有的;binlog是mysql Server层的,所有存储引擎都有
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志

在这里插入图片描述
update语句执行流程

图中浅色框表示是在 InnoDB 内部执行的深色框表示是在执行器中执行的

两阶段提交

inlog 会记录所有的逻辑操作,并且是采用“追加写”的形式。如果你的 DBA 承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有binlog,同时系统会定期做整库备份。这里的“定期”取决于系统的重要性,可以是一天一备,也可以是一周一备。目前我司是开启aliyun配置每天自动备份

文章笔记来自极客时间《MySQL实战45讲》

猜你喜欢

转载自blog.csdn.net/weixin_45582733/article/details/121521069