重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
PG的全页写full_page_writes
[打印本页]
作者:
郑全
时间:
2025-9-11 17:59
标题:
PG的全页写full_page_writes
本帖最后由 郑全 于 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 防止数据页部分写入损坏的核心机制,默认开启以保障数据可靠性。除非使用具备断电保护的存储设备,否则不建议关闭,以免在系统崩溃时导致数据损坏。
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2