
# 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的工作原理
1. **写前协议**
   当一个事务修改了缓冲区中的某个数据页，PostgreSQL不会立即将该脏页刷写到磁盘的数据文件，而是先生成一个描述本次修改的WAL记录（包含修改位置、新旧值等），将该WAL记录刷写到磁盘上的WAL段文件，之后在未来的某个时刻（如检查点），才将对应的脏页批量刷入数据文件。
   
2. **日志序列号**
   每个WAL记录都有一个全局唯一的、单调递增的标识符，称为日志序列号（Log Sequence Number，简称LSN），用来标记WAL记录产生的顺序。
   
3. **WAL段文件**
   WAL被划分为多个固定大小的段文件（默认大小为16MB），存放在pg_wal目录中。当前正在写入的段文件会持续增长，当其写满后系统会自动切换到下一个段文件。当旧的WAL段文件不再需要时，系统会将其清理或归档。
   
 
#### 与WAL相关的特性和操作
在全面了解WAL的核心概念与应用场景后，本小节将为您介绍WAL的常用基础操作与高级应用特性。如果您想要深入了解并在实际业务中配置使用，可以点击[相关超链接](https://support.huaweicloud.com/rds-pg/index.html)跳转查看详细的华为云官方文档。
**解析RDS for PostgreSQL的WAL日志** ：RDS for PostgreSQL实例购买完成后，可以先登录到Linux弹性云服务器，在ECS上安装PostgreSQL客户端，然后通过开源pg_waldump解析RDS for PostgreSQL的WAL日志，详见[使用pg_waldump解析RDS for PostgreSQL的wal日志](https://support.huaweicloud.com/bestpractice-rds-pg/rds_pg_0033.html)。
