mysql 随笔

Source

redo log

核心作用

1.保证数据安全 事务提交不会丢失数据(崩溃恢复,解决的一个问题 :Buffer Pool里的脏页还没有落盘 系统宕机怎么办?)
2.提升数据写入速度,把随机IO变成顺序IO(WAL机制)

DML → 改内存(脏页)→ 写 redo log (redo log 刷盘(commit关键点))→ redo log成功 → 事务提交成功 → IO线程择机刷脏页 → checkpoint推进 → checkpoint之前redo log可覆盖

在“正常 commit 成功返回”的前提下:

redo log 已经“持久化到磁盘路径(disk)”,不会丢失(在数据库层面保证)不会丢失”是数据库语义保证,不是物理世界 100% 保证,取决于 innodb_flush_log_at_trx_commit,1(强制提交,默认的最安全,TPS最低)2(写入OS cache) 0(每秒写一次)

只有当 checkpoint 已经确认对应 redo log 所记录的数据都已落盘后,这部分 redo log 才可以被复用覆盖

组件 本质
redo log 保证事务持久性
脏页 内存修改结果
checkpoint 数据安全边界
为什么 redo log 不设计成可读?

✔ 1. 性能优先

redo log 必须:

顺序写
极快
不能解析 SQL
✔ 2. 存储空间小

如果存 SQL:

太大
太慢
不适合 crash recovery
✔ 3. 它不是“审计日志”

它的定位是:

恢复用(recovery log)
不是
❌ 人类阅读日志

WAL 顺序写 vs 随机 IO 速度差距完整结论(分 HDD/SSD,数据库真实场景)

核心原理差距来源

随机写(直接刷数据页):修改分散在不同数据页,磁盘要频繁寻道、旋转等待,延迟极高;
WAL 顺序写(redo/binlog):只追加到日志文件尾部,连续块写入,几乎无寻道开销;
WAL 本质:把多条分散随机写,合并成单次日志顺序写,脏页后台批量异步刷盘。

对比

HDD:顺序写是随机写的100 倍以上,是 WAL 设计的根本驱动力;
SATA SSD:5–20 倍;
NVMe SSD:2–10 倍;
核心原因:随机写存在机械寻道 / 闪存 GC 写放大,WAL 追加式顺序写规避了所有零散 IO 开销。

undo log

一致性解读

事务执行前符合这套规矩,事务执行后也依然符合这套规矩,规矩从头到尾是统一的,数据始终和规矩对齐。数据状态 和 预先定义的约束 保持对齐
数据库能自动保证的,是和 “数据库内置约束”(主键、非空、唯一键、外键)保持一致
业务层面的一致性,需要开发者利用事务,自己保证和 “业务规则” 保持一致