跳转至内容

PostgreSQL/WAL

来自维基教科书,自由的教科书,来自自由的世界

WAL(预写式日志)文件是 PostgreSQL 以二进制格式存储更改的数据值的文件。它属于附加信息,因此相对于数据库文件中的信息来说是冗余的。WAL 文件可以被理解为一种特定类型的“diff”文件。

WAL 文件用于

  • 在系统崩溃后重建数据库的一致状态
  • 使用 连续归档 技术进行备份和恢复
  • 复制

写入 WAL 文件非常快,因为它们总是以顺序方式写入。对于具有旋转盘片和移动读写头的传统磁盘来说尤其如此。与 WAL 文件不同,数据库文件组织成树状结构,在写入操作期间可能需要重新组织,或者包含指向其他块的指针,这些指针位于远离的位置。因此,写入数据库文件的速度要慢得多。

出于性能原因,当客户端请求写入操作(如 UPDATEDELETE)时,对数据的修改将按特定顺序进行,并且在某些部分是异步的,与客户端请求无关。首先,数据被写入并刷新到 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 是一个软限制,在这些情况下,系统可能会默默地超出该限制。


华夏公益教科书