PostgreSQL WAL机制深度解析与优化

PostgreSQL 的预写日志(Write-Ahead Logging, WAL) 是其事务持久化和数据完整性的核心机制,通过“先写日志,再写数据”的原则保障故障恢复能力。以下是深度解析:


一、WAL 的核心目标

  1. 崩溃恢复(Crash Recovery)
    • 数据库意外崩溃(如断电)时,通过重放 WAL 日志将数据恢复到一致状态。
  2. 事务持久性(Durability)
    • 已提交的事务数据绝不丢失(符合 ACID 的 D 特性)。
  3. 物理复制基础
    • WAL 日志流是主从流复制(Streaming Replication)的底层支持。

二、WAL 工作原理

关键流程
事务提交
写入 WAL Buffer
WAL Buffer 刷盘
数据写入 Shared Buffer
Checkpoint 刷脏页
  1. 提交事务时
    • 先将事务修改生成 WAL 记录(描述数据变化的逻辑)写入内存中的 WAL Buffer
  2. 日志刷盘(关键步骤)
    • 调用 fsync() 将 WAL Buffer 强制刷入磁盘的 WAL 文件(通常位于 pg_wal 目录),确保日志持久化。
  3. 数据写入
    • 事务提交成功后,实际数据才异步写入内存的 Shared Buffer Pool
  4. 脏页刷盘
    • 后台进程 Checkpointer 定期将 Shared Buffer 中的脏页写入数据文件。

⚠️ 关键点:数据写入磁盘前,其变更日志必须已落盘。即使崩溃丢失内存数据,也能通过 WAL 重放恢复。


三、WAL 日志结构

物理组成
组件描述
WAL 段文件默认 16MB 的二进制文件(如 0000000100000001000000A1),循环覆盖写入
WAL Record最小单元,包含:事务 ID、修改的页面、旧值/新值等元数据
LSN (Log Sequence Number)日志位置标识(如 1/7103E828),用于追踪复制和恢复进度

四、WAL 在恢复中的作用

  1. 崩溃后重启
    • PostgreSQL 读取最新检查点(Checkpoint),重放此后所有 WAL 记录:
      • REDO:重做已提交事务(防止数据丢失)。
      • UNDO:回滚未提交事务(保证一致性)。
  2. 时间点恢复(PITR)
    • 基于基础备份 + 增量 WAL 日志,恢复到任意时间点(需启用归档模式)。

五、WAL 相关配置优化

-- 重要参数(postgresql.conf):
wal_level = replica          -- 日志级别(minimal/replica/logical)
fsync = on                   -- 强制日志刷盘(禁用可提性能但危险!)
wal_buffers = 16MB           -- WAL 缓冲区大小(默认 -1 即 1/32 shared_buffers)
checkpoint_timeout = 5min    -- Checkpoint 最大间隔
max_wal_size = 1GB           -- WAL 最大占用空间(触发检查点)
性能权衡建议
场景优化方向
高写入负载增大 wal_buffers + 合理延长 checkpoint_timeout(减少 I/O 峰值)
数据安全性优先确保 fsync=on + full_page_writes=on(防止部分写入导致崩溃后页面损坏)
备份恢复灵活性设置 wal_level=replica + 启用 WAL 归档(archive_mode=on

六、WAL 与复制的关系

  • 物理复制(流复制)
    备库持续接收主库的 WAL 流,重放日志实现数据同步(同步/异步模式)。
  • 逻辑复制
    解析 WAL 为逻辑变更(需 wal_level=logical),跨版本或异构数据库同步。

七、监控与维护

-- 查看 WAL 状态
SELECT pg_current_wal_lsn();          -- 当前 LSN 位置
SELECT pg_walfile_name('1/7103E828'); -- LSN 对应的 WAL 文件名-- 归档监控
SELECT * FROM pg_stat_archiver;       -- WAL 归档统计信息
关键运维命令
# 手动切换 WAL 文件
psql -c "SELECT pg_switch_wal();"# 清理旧 WAL 文件(谨慎!需确保无复制/归档依赖)
pg_controldata $PGDATA | grep "Latest checkpoint"

总结:WAL 的核心价值

  • 数据安全的基石:确保已提交事务永不丢失。
  • 高性能的权衡:用顺序写日志代替随机写数据,提升并发能力。
  • 生态扩展核心:支撑物理复制、逻辑复制、PITR 等高级功能。

💡 最佳实践:生产环境务必启用 WAL 归档 + 定期基础备份,构建完整的灾备体系。对于云数据库(如 RDS/Aurora),其高可用能力本质也是基于 WAL 的深度封装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920679.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三重积分的性质

文章目录前言几何意义性质先 1 后 2 投影法先 2 后 110.13前言 规律作息。 几何意义 三重积分,只要被积分函数是正的,那么,积分的结果就是质量。可能工作还是太累了,以后有时间可以买买彩票,碰碰运气。。。。 性质…

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?)

1. 什么是线程池?它的核心原理是什么?什么是线程池? 线程池是一种基于池化思想管理和使用线程的机制。它内部维护了多个线程,等待着分配由用户提交的并发执行的任务。这避免了频繁创建和销毁线程带来的开销,从而提高了…

京东商品详情API返回值应用实践

一、API核心功能京东商品详情API(如jd.item.get或jd.union.open.goods.query)是京东开放平台提供的核心接口,用于通过商品ID(skuId)或店铺ID检索指定商品的详细信息。该接口支持获取商品基础信息、价格、库存、规格参数…

学习python第14天

汇报一下秋招进度,字节一面完后9天都没给回复,大概率被挂了,但是官网还在流程中,我又没有HR联系方式,所以直接在平台上反馈了,要么赶紧给我过,要么赶紧给我挂,耽误时间。阿里国际一面…

监听nacos配置中心数据的变化

RefreshScope实现nacos配置中心数据的动态刷新。如果需要监听nacos配置中心数据的变化&#xff0c;并执行对应的业务逻辑&#xff0c;则可以使用NacosConfigListener注解。除了需要导入微服务和nacos配置中心的jar&#xff0c;还需要额外导入如下的jar&#xff1a;<dependen…

docker搭建Apisix和Apisix Dashboard

第一步&#xff1a;github下载源码 参考&#xff1a;https://apisix.apache.org/zh/docs/apisix/installation-guide/ git clone https://github.com/apache/apisix-docker.git cd apisix-docker/example第二步&#xff1a;添加Apisix Dashboard镜像 打开./apisix-docker/examp…

ubuntu 安装conda, ubuntu24安装miniConda

1. 官网下载脚本&#xff1a; Download Success | Anaconda 我选的mini版本&#xff0c;也可以选左边的完整版 2. 下载后&#xff0c;上传至服务器/opt下 3. 执行脚本安装&#xff1a; sh Miniconda3-latest-Linux-x86_64.sh 4. 需要按照英文提示&#xff0c;输入回车&#…

现代贪吃蛇游戏的进化:从经典玩法到多人在线体验

Hi&#xff0c;我是前端人类学&#xff08;之前叫布兰妮甜&#xff09;&#xff01; 贪吃蛇游戏自1976年诞生以来&#xff0c;已经从简单的像素游戏发展成为具有丰富功能的现代游戏体验。本文将通过一个功能增强版的贪吃蛇游戏&#xff0c;探讨如何将经典游戏概念与现代Web技术…

加速智能经济发展:如何助力“人工智能+”战略在实时视频领域的落地

2025年8月&#xff0c;国务院发布了《关于深入实施“人工智能”行动的意见》&#xff08;国发〔2025〕11号&#xff09;&#xff0c;明确提出&#xff0c;到2030年&#xff0c;我国将在人工智能技术的推动下全面迈入智能经济与智能社会的新阶段。政策强调&#xff0c;要通过推动…

从 WPF 到 Avalonia 的迁移系列实战篇1:依赖属性的异同点与迁移技巧

从 WPF 到 Avalonia 系列实战篇1&#xff1a;依赖属性的异同与实践&#xff08;基于 BlinkingButton 控件&#xff09; 我的GitHub仓库Avalonia学习项目包含完整的Avalonia实践案例与代码对比。 我的gitcode仓库是Avalonia学习项目。 文中主要示例代码均可在仓库中查看&#xf…

基于开源AI大模型AI智能名片S2B2C商城小程序的产地优势产品销售策略研究

摘要&#xff1a;本文聚焦于在开源AI大模型AI智能名片S2B2C商城小程序的商业生态中&#xff0c;探讨如何利用产地优势进行产品销售。通过分析不同产品类别的产地优势&#xff0c;如阿胶类选东阿、海参类选沿海、红酒类选海外等&#xff0c;结合开源AI大模型的技术支持、AI智能名…

大数据毕业设计选题:基于大数据的用户贷款行为数据分析系统Spark SQL核心技术

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

阻塞,非阻塞,同步,异步的理解

典型的IO分为两个阶段&#xff1a;数据的准备&#xff1a;根据系统IO操作的就绪状态&#xff0c;阻塞&#xff0c;非阻塞&#xff08;从外部向内核缓冲区拷贝数据&#xff0c;应用进程的状态 内核缓冲区上是否有数据可读&#xff0c;数据没有准备好&#xff0c;应用调用recv阻塞…

uniapp监听物理返回按钮事件

1. uniapp监听物理返回按钮事件uniapp 监听页面返回功能有使用onBackPress方法和使用onUnload方法。 1.1. 使用onBackPress方法在uniapp中&#xff0c;可以使用onBackPress方法来监听页面返回事件。这个方法与onLoad等生命周期方法同级&#xff0c;可以监听左上角返回按钮或and…

Windows server 2012安装步骤

单机文件&#xff0c;选择新建虚拟机如果分配太少的话会影响后续系统使用的流畅度&#xff0c;但是后续都是可以更改的这里选择第一个即可选择自定义安装&#xff0c;然后点击下一步即可然后点击下一步&#xff0c;这里要等一段时间大小写加数字组合,记录一下密码避免后面使用的…

【开题答辩全过程】以 “与我同行”中华传统历史数字化平台的设计和分析-------为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Fortran二维数组去重(unique)算法实战

Fortran: 去重unique算法实现对二维数组的快速去重 1 引言 2 结语 1 引言 本篇介绍去重算法unique,目的是为了保留数组中的唯一值。算法原理:首先将二维数组的每一行转换成一个整数,然后对新构成的一维数组进行排序去重,最终得到正反索引。本程序与Matlab的Unique函数进行过…

小迪安全v2023学习笔记(七十四讲)—— 验证机制篇验证码绕过思路SRC挖掘演示

文章目录前记WEB攻防——第七十四天机制验证篇&重定向发送&响应状态码&跳过步骤&验证码回传&枚举验证码突破 - 回传显示&规律爆破漏洞原理案例演示回传显示规律爆破验证目标 - 重定向发送&重定向用户漏洞原理案例演示重定向发送重定向用户验证逻辑…

福彩双色球第2025100期篮球号码分析

福彩双色球第20250100期篮球号码分析&#xff0c;上期开出数字14&#xff0c;数字形式是2路球&#xff0c;合数偶数&#xff0c;大号区域数字&#xff01;最近十几期篮球明显大号区域得数字比较多&#xff0c;本期直接排除大号区域数字10-11-12-13-14-15-16。最近十几期篮球出合…

【74LS112JK触发器三进制】2022-10-8

缘由双jk触发器的工作原理是什么-其他-CSDN问答 JK触发器和触发器中最基本的RS触发器结构相似&#xff0c;其区别在于&#xff0c;RS触发器不允许R与S同时为1&#xff0c;而JK触发器允许J与K同时为1。当J与K同时变为1的同时&#xff0c;输出的值状态会反转。也就是说&#xff…