1

我在这里找到了报价

PostgreSQL 是依赖预写日志 (WAL) 的数据库之一——所有更改首先写入日志(更改流),然后才写入数据文件。这提供了持久性,因为在崩溃的情况下,数据库可能会使用 WAL 执行恢复——从 WAL 读取更改并将它们重新应用于数据文件。

从这篇文章https://blog.2ndquadrant.com/basics-of-tuning-checkpoints/

假设有 WAL 文件继续跟踪查询

UPDATE page SET view_count = view_count + 1;

我可以想象这样的情况,postgres 已经将此 WAL 应用于 DB,但它在应用后立即崩溃。

DB 还没有更新最新的 WAL 位置,也没有删除 WAL 日志文件。

当 DB 启动时,它会进行恢复并再次重新应用此 WAL,不是吗?数据库中的最终值会变成view_count + 2吗?

请指教

4

1 回答 1

2

这种情况称为Partial Page Write。PostgreSQL 有配置选项来防止这个问题full_page_writes。它默认启用:

当此参数打开时,PostgreSQL 服务器在检查点后第一次修改该页面期间将每个磁盘页面的全部内容写入 WAL。这是必需的,因为在操作系统崩溃期间正在进行的页面写入可能仅部分完成,从而导致包含新旧数据混合的磁盘页面。

通过恢复页面副本而不是重做更新来重放更改。

于 2017-12-26T17:23:49.500 回答