全部术语

预写式日志(WAL)

PostgreSQL 中的预写式日志(WAL)是什么?

预写式日志会在每个变更写入数据文件之前先将其记录下来,使 PostgreSQL 能在崩溃后恢复。WAL 还为复制和时间点恢复提供数据。

预写式日志的核心思想是:对数据文件的修改,只有在这些修改已记录到日志、并且日志已刷写到永久存储之后,才能写入。崩溃后,PostgreSQL 会从最近一次检查点开始重放日志,使数据文件恢复到一致的状态。

由于事务提交时只需刷写顺序写入的日志,而不必刷写它修改过的每个数据页,WAL 还减少了磁盘写入。流复制发送给备用服务器的,以及持续归档为时间点恢复所保存的,都是同一串 WAL 记录。日志中的位置称为日志序列号(LSN)。

示例

该示例显示配置的 wal_level,以及创建一张包含 10,000 行的表前后的当前 WAL 位置。第二个位置更靠后,因为新表已被写入日志。

SHOW wal_level;
SELECT pg_current_wal_lsn();

CREATE TABLE wal_demo AS SELECT g FROM generate_series(1, 10000) AS g;

SELECT pg_current_wal_lsn();

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语