WAL(Write-Ahead Logging,预写日志)是现代数据库(如 PostgreSQL、MySQL InnoDB、SQLite、LevelDB/RocksDB 等)用来保证数据安全、持久性和崩溃恢复能力的核心机制。简单来说,它的核心原则是:
在对数据进行实际修改之前,必须先把“要做的修改”写入日志并持久化。
下面从原理到机制,系统说明 WAL 如何保证数据安全。
当发生数据修改(INSERT / UPDATE / DELETE)时:
这样即使数据库突然崩溃:
fsync 强制落盘✅ 好处:
数据库遵守规则:
没有写日志 = 没有提交成功
事务提交时:
这样:
重启数据库时:
结果:
✅ 满足 ACID 中的 D(Durability)
如果 WAL 无限增长,恢复会变慢,因此引入 Checkpoint:
作用:
WAL 记录通常是:
恢复时:
| 风险 | WAL 如何解决 |
|---|---|
| 宕机导致数据丢失 | 已提交事务日志已落盘,可恢复 |
| 写一半的数据页损坏 | 用 WAL 重做,覆盖错误页 |
| 事务中途崩溃 | Undo 日志回滚 |
| 磁盘写失败 | 日志未确认提交,视为未提交 |
直接写数据的问题:
WAL 的优势:
pg_wal/commit → WAL fsyncstartup process 重放 WALWAL 通过“先记日志、后改数据、日志落盘、崩溃重放”的方式,确保即使系统崩溃,已提交的数据也绝不丢失,从而实现真正的数据安全。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。