1. 更新语句执行流程

1
mysql> update T set c=c+1 where ID=2;
  1. 客户端通过连接器连接 MySQL 服务器
  2. 将缓存中相关表的结果清空
  3. 分析器通过词法和语法分析判断是更新语句
  4. 优化器通过索引,决定使用 ID 的索引
  5. 执行器执行更新语句
  6. 进行 redo log 和 bin log 的修改

2.Redo log(引擎日志)

情景老板记账:先把借帐和还账记录写在黑板上,空闲时,再把黑板上账的写入到账本中。

作用: 用作数据库写入将数据磁盘的缓存,防止每次更新都要将数据写进磁盘,提高了更新效率。

1. WAL (Write-Ahead Logging)

**先写日志,再写磁盘**。

InnoDB 引擎会把记录写道 redo log 中,并更新内存。然后更新就算完成。引擎会在空闲时间操作记录

写入磁盘。

如果 redo log 写满了,会把一部分记录更新到磁盘中。

通过 write pos 和 check point 两个指针来判断日志是否写满

2. crash-safe

当数据库发生异常时,可以通过 redo log 可以获取到之前的提交记录。

通过提交记录可以将未同步到数据库中数据同步到数据库中。

redo log 存储的是物理变更日志,用于记录磁盘中指定地方的数值修改记录。

3. 特点

  1. 存储的物理日志(记录的是数据页上数据的更改)
  2. 先写日志,后写磁盘
  3. 可以 crash safe 进行数据的修复
  4. InnoDB 引擎层日志
  5. 空间有限会用完,通过队列的实现循环写

3. binlog(Server 层日志)

1. 特点

  1. 服务层日志
  2. 存储的内容是逻辑日志(记录的是语句的原始逻辑)
  3. 空间无限,通过新增文件实现追加写

4. 执行流程

  1. 执行引擎先找到 ID=2 的这一行数据,如果内存中存在直接返回给执行器,否则从磁盘读入内存然后返回给执行器
  2. 把值加上 1,然后调用引擎接口写入数据
  3. 引擎会将新数据更新到内存中,同时更新到 redo log 中。redo log 处于 prepare 状态,告诉执行器完成了,可以提交事务了。
  4. 执行器生成更新操作的 bin log,并把 bin log 写入磁盘
  5. 执行器调用引擎的事务接口,将写入的 redo log 改成 commit 状态

5. 两阶段提交


原因

  1. 如果发生 crash 导致系统崩溃的话,如果顺序不一致,可能导致之后无法通过 binlog 恢复到任一时刻的数据
  2. 可能导致 binlog 和 redo log 的数据不一致导致数据冲突。

6. 两种日志的不同点

  1. redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 层实现的
  2. redo log 是物理日志,记录的是 在某个数据页上做了修改,binlog 是逻辑日志记录的是语句逻辑 给 ID=2 的数据进行加 1
  3. redo log 是循环写,空间大小固定。bin log 是追加写,当 bin log 文件到达一定大小后会切换到下一个,不会覆盖以前的日志

7. 小结

  1. 更新语句的执行流程
  2. Redo log 的作用是用来存储 MySQL 产生更新语句的物理日志。通过 WAL 技术先将日志写入 队列中然偶后通过指定条件写入磁盘中
  3. bin log 的作用和特点
  4. 两种日志的不同点
  5. 两阶段提交的作用
    1. 保证数据库的数据不冲突