WAL
PostgreSQL的WAL(Write-Ahead Logging,预写日志)是一种关键的可靠性机制。在对数据页进行任何修改之前,系统必须先将描述该修改的日志记录写入持久化的WAL文件,以确保在数据库崩溃后能够从日志中精确重演所有已提交的操作,从而恢复到一致状态。
为什么需要WAL
WAL是PostgreSQL的核心机制之一,为数据安全保障、高性能实现以及复制、备份等高级功能提供支撑。借助WAL日志,可确保数据不丢失、系统不崩溃,并满足生产环境对可靠性和吞吐能力的需求。
WAL的优势是什么
- 提高数据恢复能力:如果系统在数据更改过程中意外崩溃,WAL日志可用于恢复未完成的事务,确保数据库的一致性。系统重启后,可通过重放日志记录来恢复数据。
- 减少磁盘I/O:在传统数据库系统中,每次数据修改都必须立即写入主数据库文件,这会导致大量的磁盘I/O操作。采用WAL日志时,数据修改首先写入日志文件,日志文件通常较小且采用顺序写入方式,因此写入速度更快。主数据库文件的更新可以延后执行,从而降低磁盘I/O的次数。
- 支持并发操作:WAL日志支持多个事务并发执行,每个事务的更改记录在日志中相互独立。
- 简化备份和恢复:WAL日志可以用于实现增量备份和恢复。通过备份日志文件,可以在不中断数据库服务的情况下进行备份。在恢复时,可以使用备份的数据库文件和日志文件来恢复到特定的时间点。
- 提高数据完整性:WAL日志确保了数据更改的原子性和持久性。即使在系统崩溃的情况下,也可以通过日志文件确保事务的完整性和数据的一致性。
WAL的使用场景
- 崩溃恢复:数据库意外宕机(数据库服务器突然断电、操作系统崩溃或进程被强制终止)后重启时,PostgreSQL会自动进入恢复模式,从最后一次检查点开始,顺序重放所有WAL中已完成事务的修改。最终将数据文件恢复到一致状态,保证已提交事务不丢失,已回滚或未完成的事务不可见。
- 时间点恢复:通过连续归档WAL段文件,结合基础备份,可以将数据库恢复到任意一个过去的时间点。只要WAL归档完整,就能重放到目标时刻。
- 流复制:系统需配置备库,以实现故障转移或分担只读查询。主库实时将生成的WAL记录发送给备库,备库持续重放这些WAL,从而保持与主库的同步。
- 基于WAL的审计与数据版本追踪:逻辑解码让审计变得精确且低侵入性。通过逻辑解码插件,可以捕获到每一行变更的完整前像(old)和后像(new),并以事务为单位输出。这些数据可写入审计日志表或外部系统,实现不可篡改的变更记录。
WAL的工作原理
- 写前协议
当一个事务修改了缓冲区中的某个数据页,PostgreSQL不会立即将该脏页刷写到磁盘的数据文件,而是先生成一个描述本次修改的WAL记录(包含修改位置、新旧值等),将该WAL记录刷写到磁盘上的WAL段文件,之后在未来的某个时刻(如检查点),才将对应的脏页批量刷入数据文件。
- 日志序列号
每个WAL记录都有一个全局唯一的、单调递增的标识符,称为日志序列号(Log Sequence Number,简称LSN),用来标记WAL记录产生的顺序。
- WAL段文件
WAL被划分为多个固定大小的段文件(默认大小为16MB),存放在pg_wal目录中。当前正在写入的段文件会持续增长,当其写满后系统会自动切换到下一个段文件。当旧的WAL段文件不再需要时,系统会将其清理或归档。
与WAL相关的特性和操作
在全面了解WAL的核心概念与应用场景后,本小节将为您介绍WAL的常用基础操作与高级应用特性。如果您想要深入了解并在实际业务中配置使用,可以点击相关超链接跳转查看详细的华为云官方文档。
解析RDS for PostgreSQL的WAL日志:RDS for PostgreSQL实例购买完成后,可以先登录到Linux弹性云服务器,在ECS上安装PostgreSQL客户端,然后通过开源pg_waldump解析RDS for PostgreSQL的WAL日志,详见使用pg_waldump解析RDS for PostgreSQL的wal日志。