温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

预写日志WAL的工作原理是什么

发布时间:2026-09-27 15:13:03 来源:亿速云 阅读:85 作者:小樊 栏目:数据库

WAL(Write-Ahead Logging,预写日志) 是数据库系统中用来保证原子性和持久性的一种核心机制。它的核心思想可以概括为一句话:

在修改数据之前,必须先把“要做的修改”记录到日志里,并且日志要先于数据落盘。

下面从原理、流程和关键点逐步说明。


一、为什么需要 WAL

数据库数据通常放在磁盘上的数据页中,直接写磁盘有两点问题:

  1. 随机写代价高:修改一行可能只改几字节,但要写整个页
  2. 崩溃不安全:写到一半系统宕机,数据可能处于中间状态

WAL 通过“先写日志、后写数据”的方式解决这两个问题:

  • 日志是顺序写,性能高
  • 日志完整记录了“发生了什么”,可用于恢复

二、WAL 的基本工作流程

以一次更新操作为例:

1. 事务开始

BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;

2. 生成日志记录(Redo Log)

在内存中生成一条 WAL 记录,例如:

LSN=102
事务ID=TX1
表空间/页号/偏移
旧值: 1000
新值: 900

3. 写日志(关键步骤)

  • 日志先写入 WAL Buffer
  • 在事务提交时:
    • 日志 flush 到磁盘
    • 成功后才算“提交成功”

✅ 这就是 “Write-Ahead”:数据页还没改,日志已经安全了

4. 修改内存中的数据页

  • 修改的是 Buffer Pool(内存页)
  • 此时磁盘上的数据页还是旧的

5. 后台异步刷脏页

  • 由后台线程将脏页写回磁盘
  • 不需要每次事务都写数据页

三、崩溃恢复时如何用 WAL

假设数据库崩溃后重启:

情况 1:事务已提交,但数据页还没写盘

  • 日志里有 commit 记录
  • 用 Redo 日志 重放修改
  • 保证不丢数据(持久性)

情况 2:事务未提交,但数据页已写盘

  • 日志里没有 commit
  • 用 Undo 日志 回滚修改
  • 保证原子性

四、WAL 的关键概念

1. LSN(Log Sequence Number)

  • 日志的顺序编号
  • 数据页会记录“当前页对应的最大 LSN”
  • 用于判断:
    • 哪些日志已应用
    • 哪些需要 Redo

2. Force Log at Commit

  • 提交时必须保证日志落盘
  • 这是持久性的底线

3. checkpoint(检查点)

  • 定期把内存脏页刷盘
  • 记录“哪些日志已不再需要”
  • 加快恢复速度

五、一句话总结

WAL 的原则是:任何数据修改,先写日志、后改数据;日志安全,数据才能安全。

这也是 MySQL(InnoDB Redo Log)、PostgreSQL、SQLite、HBase 等系统共同依赖的底层机制。

如果你愿意,我也可以:

  • 用 MySQL InnoDB 的 Redo/Undo 具体讲
  • 画一张 WAL 写流程和崩溃恢复流程图
  • 对比 WAL vs 影子分页 的优缺点
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手