加载中...

| 中文名 | 预写日志 |
| 英文名 | Write-Ahead Logging |
| 缩写 | WAL |
| 类别 | 持久性与恢复机制 |
| 核心规则 | 先写日志再改数据 |
预写日志(Write-Ahead Logging,简称WAL)是数据库和存储系统中保证原子性与持久性的关键技术。其基本规则是:在把数据的修改真正写入数据文件之前,必须先把描述该修改的日志记录写入并持久化到日志文件中。
数据库在修改数据页时,如果直接写入数据文件,一旦中途发生崩溃就可能留下不完整的、损坏的数据。预写日志通过先写日志的策略解决这个问题:每次变更先以顺序追加的方式写入日志,日志落盘成功后才认为事务可以提交,实际的数据页可以稍后再异步刷盘。系统崩溃重启后,可以通过重放日志把已提交但尚未落盘的修改补齐,或回滚未完成的事务,从而恢复到一致状态。
几乎所有支持事务的关系型数据库都采用预写日志来保证崩溃恢复和事务持久性。分布式系统用日志复制实现多副本一致性,主节点先写日志再同步给从节点。消息队列和键值存储也常用预写日志保证消息不丢失。文件系统的日志功能同样借鉴了这一思想以避免元数据损坏。
问:预写日志为什么能提升写入性能?答:虽然多了一次写日志,但日志是顺序追加写入,磁盘顺序写远快于随机写;而数据页的实际落盘可以延迟并批量进行,这样既保证了持久性,又把大量随机写转化为高效的顺序写。
问:预写日志和数据文件不同步会丢数据吗?答:不会。只要日志已经持久化,即使数据文件还未更新,崩溃后也能通过重放日志把修改补上;反之,未写入日志的修改视为未提交,恢复时会被丢弃,始终保持一致。

| 中文名 | 预写日志 |
| 英文名 | Write-Ahead Logging |
| 缩写 | WAL |
| 类别 | 持久性与恢复机制 |
| 核心规则 | 先写日志再改数据 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧