温馨提示×

温馨提示×

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

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

为什么数据库需要WAL预写日志

发布时间:2026-10-18 04:51:07 来源:亿速云 阅读:93 作者:小樊 栏目:数据库

数据库需要 WAL(Write-Ahead Logging,预写日志),核心原因是为了在保证数据可靠性的同时,提高性能并支持崩溃恢复。可以从以下几个关键点理解:


1. 保证“原子性”和“持久性”(ACID)

数据库事务需要满足:

  • 原子性(Atomicity):事务要么全做,要么全不做
  • 持久性(Durability):一旦提交,数据不能丢

如果没有 WAL:

  • 直接改数据页 → 写到一半系统崩溃 → 数据处于“半成品”状态
  • 已提交事务可能丢失

WAL 的规则是:

先写日志,再改数据(Log First)

这样即使数据还没落盘,只要日志写了,就能恢复。


2. 支持崩溃恢复(Crash Recovery)

系统崩溃后重启时:

  • 通过 WAL 重放(Redo)已提交事务
  • 回滚(Undo)未提交事务

示例:

  1. 事务 T 修改数据
  2. 先写 WAL:T 修改了 X 从 1 → 2
  3. 再改内存页
  4. 崩溃发生
  5. 重启后:
    • 若日志已提交 → Redo
    • 若日志未提交 → Undo

3. 提升性能(比起直接写数据页)

如果没有 WAL:

  • 每次修改都要随机写数据文件(很慢)

有了 WAL:

  • 日志是顺序写(很快)
  • 数据页可以:
    • 先在内存修改
    • 延迟批量刷盘(Checkpoint)

✅ 顺序写 ≫ 随机写
✅ 减少磁盘 IO


4. 支持并发与隔离

WAL 通常配合:

  • 锁
  • MVCC(多版本并发控制)

例如:

  • PostgreSQL / MySQL InnoDB
  • 用 WAL 记录版本变化
  • 保证并发读写不互相破坏

5. 实现复制和高可用

WAL 还可用于:

  • 主从复制(把 WAL 发给从库)
  • 时间点恢复(PITR)

例如:

  • PostgreSQL WAL 流复制
  • MySQL Binlog / Redo Log

一句话总结

WAL 的核心思想是:用“先写日志”换“数据安全 + 高性能 + 可恢复”。

如果你愿意,我也可以:

  • 用 MySQL InnoDB 或 PostgreSQL 具体讲 WAL
  • 画一张 WAL 写流程示意图
  • 对比 WAL vs Binlog / Redo / Undo
向AI问一下细节

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

AI
助
手