我在这里找到了引用
PostgreSQL是依赖于预写日志(WAL)的数据库之一 - 所有更改都首先写入日志(更改流) 然后到数据文件。这提供了耐久性,因为在a的情况下 崩溃数据库可能会使用WAL来执行恢复 - 读取更改 从WAL并重新应用于数据文件。
来自这篇文章https://blog.2ndquadrant.com/basics-of-tuning-checkpoints/
假设有WAL文件保持跟随查询
UPDATE page SET view_count = view_count + 1;
我可以想象,postgres已将这个WAL应用于DB 但它在申请后就崩溃了。
DB不会更新最新的WAL位置NOR删除WAL日志文件。
当DB启动时,它会恢复并再次重新应用此WAL,不是吗?
数据库中的最终值是view_count + 2
吗?
请告知
答案 0 :(得分:1)
这种情况称为部分页面写入。 PostgreSQL具有配置选项,可防止出现此问题full_page_writes
。它默认启用:
当此参数打开时,PostgreSQL服务器会在检查点之后第一次修改该页面时将每个磁盘页面的全部内容写入WAL。这是必需的,因为在操作系统崩溃期间正在处理的页面写入可能只是部分完成,从而导致包含旧数据和新数据混合的磁盘上页面。
通过恢复页面副本而不是重做更新来重播更改。