【问题标题】:Would it possible that postgres Write-Ahead Log DOUBLE RE-APPLY?postgres 预写日志是否有可能重新申请?
【发布时间】:2018-06-07 11:12:46
【问题描述】:

我在这里找到了报价

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 吗?

请指教

【问题讨论】:

    标签: postgresql wal


    【解决方案1】:

    这种情况称为部分页面写入。 PostgreSQL 有配置选项来防止这个问题full_page_writes。默认启用:

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

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

    【讨论】:

    • 有道理,非常感谢!
    • 我还有一个问题。如果它更新整个表的数据真的很大(例如表大小 2gb)。 full_page_writes 会因为内存不够大而限制这个操作吗?
    • 不,full_page_writes 对写入的页数没有限制。 Postgre 中的每个表都存储为一个固定大小的数组pages。特定行可以存储在任何页面中。此页面在第一次修改时写入 WAL。所以如果整个表(每一行)被修改,所有对应的页面都会被写入 WAL。
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多