PostgreSQL/WAL
WAL(预写式日志)文件是 PostgreSQL 以二进制格式存储更改的数据值的文件。它属于附加信息,因此相对于数据库文件中的信息来说是冗余的。WAL 文件可以被理解为一种特定类型的“diff”文件。
WAL 文件用于
- 在系统崩溃后重建数据库的一致状态
- 使用 连续归档 技术进行备份和恢复
- 复制
写入 WAL 文件非常快,因为它们总是以顺序方式写入。对于具有旋转盘片和移动读写头的传统磁盘来说尤其如此。与 WAL 文件不同,数据库文件组织成树状结构,在写入操作期间可能需要重新组织,或者包含指向其他块的指针,这些指针位于远离的位置。因此,写入数据库文件的速度要慢得多。
出于性能原因,当客户端请求写入操作(如 UPDATE
或 DELETE
)时,对数据的修改将按特定顺序进行,并且在某些部分是异步的,与客户端请求无关。首先,数据被写入并刷新到 WAL 文件中。其次,数据被存储在 RAM 中的共享缓冲区中。最后,它从共享缓冲区写入到数据库文件。客户端不会等待所有操作完成。在执行了前两个非常快的操作之后,客户端会收到请求已完成的通知。第三个操作是在稍后(或先前)的某个时间点异步执行的。
WAL 文件收集在 pg_wal 目录中(在 PostgreSQL 10 之前的版本中为 pg_xlog)。根据数据库的写入活动,所有 WAL 文件的总大小可能会急剧增加。因此,系统必须在这些文件不再需要时将其删除。在共享缓冲区中的更改(与 WAL 文件的内容相对应)被刷新到数据库文件后,WAL 文件便可供删除。由于在 CHECKPOINT
完成后可以保证该条件满足,因此在 WAL 文件删除操作和 CHECKPOINT
之间存在一些依赖关系。
- 您可以定义所有文件在该目录中的总大小限制:
max_wal_size
。如果达到该限制,PostgreSQL 将执行自动CHECKPOINT
操作。 - 您可以定义一个
checkpoint_timeout
,以秒为单位。不晚于此秒数,PostgreSQL 将执行自动CHECKPOINT
操作。
在这两种情况下,共享缓冲区都会写入磁盘,一个检查点记录被写入当前的 WAL 文件,所有旧的 WAL 文件都可以被删除。
其他条件可能会阻止 WAL 文件的删除,特别是归档命令失败。max_wal_size
是一个软限制,在这些情况下,系统可能会默默地超出该限制。