WAL(Write-Ahead Logging,预写日志)是数据库和存储系统中非常核心的机制。之所以需要它,主要是为了解决性能、可靠性和一致性之间的矛盾。
下面从几个关键角度解释“为什么需要 WAL”。
问题:
如果数据库直接把数据写入磁盘中的数据页(Table / Index Page),一旦系统崩溃(断电、进程挂掉),可能只写了一半,数据就处于不一致状态。
WAL 的做法:
在任何数据修改真正落盘之前,先把“我准备做什么修改”记录到 WAL 日志里,并且保证 WAL 先持久化。
✅ 即使后续数据页没写完,重启时也可以通过 WAL 重放(redo)恢复。
原则:先写日志,再改数据(Write Ahead)
问题:
真实数据在磁盘上是分散的(B+树、堆表等),直接写数据往往是随机 I/O,非常慢。
WAL 的优势:
数据库可以这样优化:
✅ 写性能大幅提升,同时不丢数据。
WAL 是 ACID 的基石之一:
例如:
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
COMMIT;
COMMIT 成功 = WAL 已写盘,不依赖数据页是否刷盘。
在现代数据库中(如 PostgreSQL、MySQL、TiDB):
✅ WAL 不仅是“恢复工具”,还是“数据同步通道”。
如果没有 WAL:
WAL 提供了一套统一、简单、可证明正确的机制。
WAL 的存在,是为了用“先记日志、后改数据”的方式,在性能、崩溃安全和事务语义之间取得平衡。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。