PostgreSQL 中的“脏页(Dirty Pages)”是什么?

PostgreSQL 以固定大小的数据块(Page)存储数据,默认大小为 8 KB。当客户端执行更新或插入操作时,PostgreSQL 并不会立即将变更写入磁盘,而是先将相关数据页加载到共享内存(Shared Buffers)中,在内存中完成修改,并将该页面标记为"脏页"。所谓"脏页",是指内存中的页面版本已经新于磁盘上的对应版本

在向客户端返回操作结果之前,PostgreSQL 会先将变更记录写入预写日志(Write-Ahead Log,WAL),以保证即使数据库发生崩溃也能恢复数据一致性。但实际的数据文件并不会立刻更新,只有在检查点(Checkpoint)触发或后台写进程执行刷新时,脏页才会被写回磁盘

在此之前,脏页会持续累积在内存中,直到通过以下三种机制之一被刷新:

  • 后台写进程(Background Writer,BGWriter):一个常驻后台进程,在可用的干净缓冲区数量下降时,持续将脏页写入磁盘
  • 检查点进程(Checkpointer):在触发检查点时(如达到 checkpoint_timeout 或 WAL 超过 max_wal_size),将所有脏页刷新到磁盘
  • 后端进程(Backend):在紧急情况下(如共享缓冲区几乎全部为脏页),普通后端进程会自行写脏页,可能导致用户查询阻塞

理解并合理控制脏页的刷新时机与方式,是优化 PostgreSQL 性能的关键

相关推荐
秋96 分钟前
windows中安装redis
数据库·redis·缓存
Cosolar28 分钟前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
想唱rap35 分钟前
IO多路转接之poll
服务器·开发语言·数据库·c++
SeaTunnel43 分钟前
AI 让 SeaTunnel 读源码和调试过时了吗?
大数据·数据库·人工智能·apache·seatunnel·数据同步
凯瑟琳.奥古斯特1 小时前
数据冗余与规范化的本质[数据库原理]
开发语言·数据库·职场和发展
_ku_ku_2 小时前
数据库系统原理 · SQL 数据定义、更新及数据库编程 · 自学总结
数据库·oracle
Mortalbreeze2 小时前
深度理解文件系统 ---- 从磁盘存储到内核存储
大数据·linux·数据库
2301_803934612 小时前
MySQL 字段类型选择规范指南
jvm·数据库·python
oddsand13 小时前
Redis网络模型
java·数据库·redis
皮卡祺q3 小时前
【redies0-导论】分布式系统的演进-引进redis原因
java·数据库·redis