jieye の 数字花园

Search

Search IconIcon to open search

log

Last updated Unknown

# Log

# Log

# Undolog

# 持久化

undo log 和数据页的刷盘策略是一样的,都需要通过 redo log 保证持久化。

buffer pool 中有 undo 页,对 undo 页的修改也都会记录到 redo log。redo log 会每秒刷盘,提交事务时也会刷盘,数据页和 undo 页都是靠这个机制保证持久化的。

# Redolog

WAL (Write-Ahead Logging)技术指的是, MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上。 ^6b023b

# 持久化

Pasted image 20230504003619.png

# Binlog

# 持久化

一个事务的 binlog 是不能被拆开的,因此无论这个事务有多大(比如有很多条语句),也要保证一次性写入,MySQL 给每个线程分配了一片内存用于缓冲 binlog ,该内存叫 binlog cache
Pasted image 20230504004446.png
MySQL 提供一个 sync_binlog 参数来控制数据库的 binlog 刷到磁盘上的频率(每次提交事务都只 write,不 fsync or 每次提交事务都会 write,然后马上执行 fsync or 每次提交事务都 write,但累积 N 个事务后才 fsync)

# 主从复制

Pasted image 20230504004122.png
在实际使用中,一个主库一般跟 2 ~ 3 个从库(1 套数据库,1 主 2 从 1 备主),这就是一主多从的 MySQL 集群结构。
三种模型

# Update 语句的执行过程

  1. 执行器调用存储引擎的接口,通过主键索引树搜索记录:
    • 数据页本来就在 buffer pool 中,就直接返回给执行器更新;
    • 记录不在 buffer pool,将数据页从磁盘读入到 buffer pool,返回记录给执行器。
  2. 执行器得到聚簇索引记录后,会看一下更新前的记录和更新后的记录是否一样:
    • 如果一样的话就不进行后续更新流程;
    • 如果不一样的话就把更新前的记录和更新后的记录都当作参数传给 InnoDB 层,让 InnoDB 真正的执行更新记录的操作;
  3. 开启事务, InnoDB 层更新记录前,首先要记录相应 undo log,旧值会写入 Buffer Pool 中的 Undo 页面,不过在内存修改该 Undo 页面后,需要记录对应的 redo log
  4. InnoDB 层开始更新记录,会先更新内存(同时标记为脏页),然后将记录写到 redo log 里面,这个时候更新就算完成了。WAL!
  5. 至此,一条记录更新完了。
  6. 一条更新语句执行完后,开始记录该语句对应的 binlog 被保存到 binlog cache,并没有刷新到硬盘上的 binlog 文件,在事务提交时才会统一将该事务运行过程中的所有 binlog 刷新到硬盘。
  7. 事务提交,剩下的就是两阶段提交

两阶段提交