重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 287|回复: 0
打印 上一主题 下一主题

PG的全页写full_page_writes

[复制链接]
跳转到指定楼层
楼主
发表于 2025-9-11 17:59:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 郑全 于 2025-9-11 18:01 编辑

在 PostgreSQL 中,full_page_writes 是一个与数据可靠性相关的重要配置参数,主要用于防止数据库崩溃或崩溃时出现数据页损坏,默认值为 on(开启状态)。
核心作用
当 full_page_writes = on 时,PostgreSQL 在  检查点(checkpoint)之后首次修改数据页 时,会将整个数据页(而非仅修改的部分)写入 WAL(预写日志)。

这一机制的目的是应对 部分写入(partial write)问题:如果数据库在写入数据页的过程中突然崩溃(如断电),可能导致数据页只写入了一部分,形成不完整的 “损坏页”。而 WAL 中存储的完整页数据,可在数据库重启时通过恢复流程重建完整的数据页,避免数据损坏。

工作原理
  • 检查点(checkpoint):数据库定期将内存中的脏数据(已修改但未写入磁盘的数据)刷写到磁盘,并记录此时的 WAL 位置,作为恢复的起点。
  • 首次修改:检查点后,当某个数据页被第一次修改时,PostgreSQL 会将整个页的内容写入 WAL。
  • 后续修改:同一数据页的后续修改仅需写入增量变化(即 “差异”),无需重复写入完整页,以减少 WAL 体积和 I/O 开销。
  • 崩溃恢复:若数据库崩溃,重启时会从最近的检查点开始重放 WAL。对于检查点后首次修改的数据页,WAL 中保存的完整页数据可直接用于重建,避免部分写入导致的损坏。

优缺点分析
优点
  • 数据可靠性高:彻底避免了部分写入导致的数据页损坏,是保障数据库一致性的关键机制之一。
  • 恢复安全:在数据库崩溃后,能通过 WAL 中的完整页数据准确恢复,确保数据不丢失或损坏。

缺点

  • WAL 体积增大:检查点后首次修改数据页时写入完整页会增加 WAL 的生成量,可能导致更多的磁盘 I/O 开销,尤其在大表频繁更新的场景下。
  • 性能影响:额外的完整页写入会略微降低写入性能(通常影响较小,除非系统 I/O 压力极大)。

适用场景

  • 默认推荐开启:对于绝大多数生产环境,尤其是对数据一致性要求高的场景(如金融、电商),full_page_writes = on 是必要的,牺牲少量性能换取数据可靠性。
  • 可考虑关闭的特殊场景:
    • 数据库使用  具有断电保护的存储设备(如配备电池备份单元 BBU 的 RAID 卡),可确保数据页写入不会出现部分失败,此时可关闭以提升性能。
    • 纯测试环境,且不关心数据完整性(不建议在生产环境关闭)。

配置方式


修改 postgresql.conf 文件:

full_page_writes = on  # 默认值,推荐生产环境使用
# full_page_writes = off  # 仅在特殊场景下考虑关闭
  
修改后需重启 PostgreSQL 生效。

总结
   full_page_writes 是 PostgreSQL 防止数据页部分写入损坏的核心机制,默认开启以保障数据可靠性。除非使用具备断电保护的存储设备,否则不建议关闭,以免在系统崩溃时导致数据损坏。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-18 03:01 , Processed in 0.299720 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表