附录 M. 术语表
这是术语及其在PostgreSQL和一般关系数据库系统中的含义的列表。
- ACID
- 聚合函数(例程)
一个函数,它组合(聚合)多个输入值,例如通过计数、求平均值或求和,产生单个输出值。
有关更多信息,请参见第 9.21 节。
另请参见窗口函数(例程)。
- 分析函数
参见窗口函数(例程)。
- 分析(操作)
从表和其他关系中的数据收集统计信息的行为,以帮助查询计划程序决定如何执行查询。
(不要将此术语与EXPLAIN命令的
ANALYZE
选项混淆。)有关详细信息,请参阅 ANALYZE。
- 原子
关于 数据 的引用:其值无法分解为更小的组件这一事实。
- 原子性
事务 的属性,即其所有操作作为一个单元完成,或没有一个操作完成。此外,如果在执行事务期间发生系统故障,则在恢复后不会显示任何部分结果。这是 属性之一。
- 属性
在 元组 中发现的具有特定名称和数据类型的元素。
- 自动清理(进程)
例行执行 清理 和 分析 操作的一组后台进程。协调工作且始终存在的 辅助进程 称为自动清理启动器,而执行任务的进程称为自动清理工作进程。
有关详细信息,请参阅 第 25.1.6 节。
- 辅助进程
负责实例中某些特定后台任务的实例中的一个进程。辅助进程包括自动清理启动器(但不是自动清理工作进程)、后台写入器、检查点进程、日志记录器、启动进程、WAL 归档器、WAL 接收器(但不是WAL 发送器)和WAL 写入器。
- 后端(进程)
- 后台工作进程
在实例中运行系统或用户提供的代码的进程。作为PostgreSQL中多个功能的基础设施,例如逻辑复制和并行查询。此外,扩展可以添加自定义后台工作进程。
有关详细信息,请参阅第 48 章。
- 后台写入器(进程)
一个辅助进程,它将脏数据页从共享内存写入文件系统。它会定期唤醒,但只工作一小段时间,以便随着时间的推移将昂贵的活动分配出去,以避免生成可能会阻塞其他进程的较大的峰值。
有关详细信息,请参阅第 20.4.5 节。
- 基准备份
所有数据库集群文件的二进制副本。它由工具pg_basebackup生成。结合 WAL 文件,它可以用作恢复、日志传送或流复制的起点。
- 膨胀
数据页中不包含当前行版本的空间,例如未使用的(空闲)空间或过时的行版本。
- 引导超级用户
此用户拥有每个数据库中的所有系统目录表。它也是所有授予权限的来源角色。由于这些原因,此角色不能被删除。
此角色还充当正常的数据库超级用户。
- 缓冲区访问策略
一些操作会访问大量的页面。缓冲区访问策略有助于防止这些操作从共享缓冲区中驱逐太多页面。
缓冲区访问策略设置对有限数量共享缓冲区的引用,并循环重用它们。当操作需要一个新页面时,将从策略环中的缓冲区中选择一个受害者缓冲区,这可能需要将页面的脏数据刷新到永久存储,甚至可能还需要将未刷新的WAL刷新到永久存储。
缓冲区访问策略用于各种操作,例如大表的顺序扫描、
VACUUM
、COPY
、CREATE TABLE AS SELECT
、ALTER TABLE
、CREATE DATABASE
、CREATE INDEX
和CLUSTER
。- 转换
将数据项从其当前数据类型转换为另一种数据类型。
有关更多信息,请参见CREATE CAST。
- 目录
标准使用此术语来表示在PostgreSQL术语中称为数据库的内容。
(不要将此术语与系统目录混淆)。
有关更多信息,请参见第 23.1 节。
- 检查约束
在关系上定义的一种约束,它限制了一个或多个属性中允许的值。检查约束可以引用关系中同一行中的任何属性,但不能引用同一关系或其他关系的其他行。
有关更多信息,请参阅第 5.4 节。
- 检查点
在预写式日志序列中,保证堆和索引数据文件已使用在该检查点之前修改的共享内存中的所有信息进行更新;检查点记录会写入并刷新到预写式日志以标记该点。
检查点也是执行达到如上定义的检查点所需的所有操作的行为。当满足预定义条件(例如,已过指定时间或已写入一定量的记录)时,将启动此过程;或者用户可以使用命令
CHECKPOINT
调用此过程。有关更多信息,请参阅第 30.5 节。
- 检查点程序(进程)
- 类(已过时)
请参阅关系。
- 客户端(进程)
- 集群所有者
拥有数据目录的操作系统用户,并且
postgres
进程在其下运行。在创建新的数据库集群之前,此用户必须存在。在具有
root
用户的操作系统上,不允许该用户成为集群所有者。- 列
- 提交
在事务内完成数据库最终操作的行为,该操作使事务对其他事务可见,并确保其持久性。
有关详细信息,请参阅COMMIT。
- 并发
- 连接
客户端进程和后端进程之间建立的通信线路,通常通过网络,支持会话。此术语有时用作会话的同义词。
有关详细信息,请参阅第 20.3 节。
- 一致性
数据库中的数据始终符合完整性约束的属性。在提交之前,事务可能会暂时违反某些约束,但是如果在提交时未解决此类违规行为,则此类事务将自动回滚。这是属性之一。
- 约束
有关更多信息,请参阅第 5.4 节。
- 累积统计系统
如果启用,则累积有关实例活动统计信息的一个系统。
有关详细信息,请参阅第 28.2 节。
- 数据区
参见 数据目录。
- 数据库
已命名的 本地 SQL 对象 集合。
有关更多信息,请参见第 23.1 节。
- 数据库集群
数据库和全局 SQL 对象以及它们通用的静态和动态元数据的集合。有时称为 集群。使用 initdb 程序创建数据库集群。
在 PostgreSQL 中,术语 集群有时也用于指代实例。(不要将此术语与 SQL 命令
CLUSTER
混淆。)- 数据库服务器
参见 实例。
- 数据库超级用户
具有 超级用户状态 的角色(参见 第 22.2 节)。
通常称为 超级用户。
- 数据目录
文件系统上 服务器 的基本目录,其中包含与 数据库集群 关联的所有数据文件和子目录(表空间 除外,还可以选择 WAL)。环境变量
PGDATA
通常用于指代数据目录。一个 集群 的存储空间包括数据目录以及任何其他表空间。
有关更多信息,请参见 第 73.1 节。
- 数据页
用于存储关系数据的基本结构。所有页面的大小都相同。数据页面通常存储在磁盘上,每个页面存储在一个特定文件中,并且可以读取到 共享缓冲区 中,在共享缓冲区中可以对其进行修改,使其变为 脏。写入磁盘后它们将变为干净。最初仅存在于内存中的新页面在写入之前也是脏的。
- 数据
一个 数据类型的某个值的内部表示。
- 删除
有关更多信息,请参阅 DELETE。
- 域
基于另一个基础数据类型定义的用户数据类型。除了可能限制允许的值集外,它与基础类型的作用相同。
有关更多信息,请参阅 第 8.18 节。
- 持久性
- 时期
请参阅 事务 ID。
- 扩展
可以在 实例 上安装的软件附加程序包,以获取额外功能。
有关更多信息,请参阅 第 38.17 节。
- 文件段
存储给定 关系 的数据的物理文件。文件段的大小受配置值限制(通常为 1 GB),因此如果关系超过该大小,它将被拆分为多个段。
有关更多信息,请参见 第 73.1 节。
(请勿将此术语与类似术语 WAL 段 混淆)。
- 外部数据封装器
表示未包含在本地 数据库 中的数据的一种方式,使其显示为位于本地 表 中。使用外部数据包装器,可以定义 外部服务器 和 外部表。
有关更多信息,请参阅 CREATE FOREIGN DATA WRAPPER。
- 外键
在 表 中一个或多个 列 上定义的一种 约束,要求这些 列 中的值标识另一个(或很少见地是同一个)表 中的零个或一个 行。
- 外部服务器
一个命名的 外部表 集合,所有这些表都使用相同的 外部数据包装器,并且具有其他共同的配置值。
有关更多信息,请参阅 CREATE SERVER。
- 外部表(关系)
一个关系,它看起来有类似于常规行和列的表,但会通过其外部数据包装器转发数据请求,该包装器将返回根据外部表的定义构建的结果集。
有关更多信息,请参阅CREATE FOREIGN TABLE。
- 分叉
存储关系的各个独立分段文件集。主分叉是实际数据所在的位置。还存在两个用于元数据的辅助分叉:空闲空间映射和可见性映射。未记录关系也具有init 分叉。
- 空闲空间映射(分叉)
一种存储结构,用于保留有关表的主分叉的每个数据页的元数据。每个页面的空闲空间映射条目存储可用于未来元组的空闲空间量,并且其结构经过优化,以便高效地搜索给定大小的新元组的可用空间。
有关更多信息,请参阅第 73.3 节。
- 函数(例程)
一种例程类型,它接收零个或多个参数,返回零个或多个输出值,并且受限于在一个事务中运行。函数作为查询的一部分被调用,例如通过
SELECT
。某些函数可以返回集;这些函数称为返回集的函数。函数还可以用于调用触发器。
有关更多信息,请参见CREATE FUNCTION。
- 授予
有关更多信息,请参见GRANT。
- 堆
- 主机
- 索引(关系)
一个关系,其中包含从表或物化视图派生的数据。其内部结构支持快速检索和访问原始数据。
有关更多信息,请参见CREATE INDEX。
- 插入
一个命令,用于向表中添加新数据。
有关更多信息,请参见INSERT。
- 实例
一组后端和辅助进程,它们使用一个公共共享内存区域进行通信。一个邮局进程管理实例;一个实例管理一个数据库集群及其所有数据库。只要它们的端口不冲突,许多实例就可以在同一服务器上运行。
- 隔离
在事务提交之前,事务的影响对 并发事务 不可见的属性。这是 属性之一。
有关更多信息,请参阅 第 13.2 节。
- 联接
- 键
- 锁
允许进程限制或防止对资源同时访问的机制。
- 日志文件
日志文件包含有关事件的可读文本行。示例包括登录失败、长时间运行的查询等。
有关更多信息,请参阅 第 25.3 节。
- 已记录
如果对 表 的更改已发送到 WAL,则该表被认为是 已记录 的。默认情况下,所有常规表都已记录。可以在创建时或通过
ALTER TABLE
命令将表指定为 未记录 的。- 记录器(进程)
如果启用,辅助进程 会将有关数据库事件的信息写入当前 日志文件 中。达到某些时间或容量相关条件时,将创建新的日志文件。也称为 syslogger。
有关更多信息,请参阅第 20.8 节。
- 日志记录
术语WAL 记录的旧称。
- 日志序列号 (LSN)
写入前日志中的字节偏移量,随着每个新的WAL 记录单调递增。
- LSN
请参阅日志序列号。
- 主服务器
请参阅主服务器。
- 已实现
某些信息已预先计算并存储以供以后使用,而不是实时计算的属性。
此术语用于物化视图中,表示从视图查询派生的数据与该数据的源分开存储在磁盘上。
此术语还用于引用某些多步骤查询,表示执行给定步骤产生的数据存储在内存中(有可能溢出到磁盘),以便其他步骤可以多次读取它。
- 物化视图(关系)
由
SELECT
语句(就像视图一样)定义的关系,但以表相同的方式存储数据。它不能通过INSERT
、UPDATE
、DELETE
或MERGE
操作进行修改。有关更多信息,请参阅CREATE MATERIALIZED VIEW。
- 合并
一种命令,用于使用源关系中的数据,有条件地添加、修改或删除给定表中的行。
有关详细信息,请参阅 MERGE。
- 多版本并发控制 (MVCC)
一种机制,旨在允许多个 事务 读取和写入同一行,而不会导致一个进程使其他进程停滞。在 PostgreSQL 中,MVCC 通过创建 元组 的副本(版本)来实现,因为这些元组在修改时会创建副本;在可以查看旧版本的交易终止后,需要删除这些旧版本。
- 空值
关系数据库理论的核心原则,即不存在的概念。它表示没有明确的值。
- 优化器
请参阅 查询计划程序。
- 并行查询
处理执行 查询 的部分的能力,以利用具有多个 的服务器上的并行进程。
- 分区
较大集合的几个不相交(不重叠)子集之一。
关于 分区表:每个包含分区表部分数据的表之一,称为父级。分区本身是一个表,因此也可以直接查询;同时,分区有时可以是分区表,从而允许创建层次结构。
- 分区表(关系)
- 后端(进程)
实例 的第一个进程。它启动并管理 辅助进程,并根据需要创建 后端进程。
有关详细信息,请参阅 第 19.3 节。
- 主键
在表或其他关系上定义的唯一约束的一个特例,它还保证主键中的所有属性均没有空值。顾名思义,每个表只能有一个主键,但可以有多个唯一约束,这些约束也没有可为空的属性。
- 主(服务器)
- 过程(例程)
一种例程类型。它们的特点是不会返回值,并且允许执行事务性语句,例如
COMMIT
和ROLLBACK
。它们通过CALL
命令调用。有关更多信息,请参阅CREATE PROCEDURE。
- 查询
客户端发送给后端的请求,通常用于返回结果或修改数据库中的数据。
- 查询计划程序
PostgreSQL中用于确定执行查询的最有效方法(计划)的部分。也称为查询优化器、优化器或计划程序。
- 记录
请参阅元组。
- 回收
请参阅WAL 文件。
- 引用完整性
- 关系
在数据库中所有对象的通用术语,这些对象具有名称和按特定顺序定义的属性列表。表、序列、视图、外部表、物化视图、复合类型和索引都是关系。
更笼统地说,关系是一组元组;例如,查询结果也是一个关系。
在PostgreSQL中,类是关系的一个古老的同义词。
- 副本(服务器)
与主数据库配对并维护主数据库部分或全部数据的副本的数据库。这样做最主要的原因是为了允许更多地访问该数据,并在主不可用时保持数据的可用性。
- 复制
将一个服务器上的数据复制到另一台称为副本的服务器上的行为。这可以采取物理复制的形式,其中一个服务器的所有文件更改都被逐字复制,或者逻辑复制的形式,其中使用更高级别的表示来传达定义的数据更改子集。
- 重启点
有关更多信息,请参阅第 30.5 节。
- 结果集
在命令(通常是
SELECT
,但如果指定了RETURNING
子句,则可以是INSERT
、UPDATE
或DELETE
命令)完成后,从后端进程传输到客户端的关系。结果集是关系这一事实意味着可以在另一个查询的定义中使用查询,从而成为子查询。
- 撤销
一个命令,用于阻止对命名的数据库对象集的访问,针对命名的角色列表。
有关详细信息,请参阅REVOKE。
- 角色
对实例的访问权限的集合。角色本身是一种可以授予其他角色的权限。通常这样做是为了方便或为了确保当多个用户需要相同的权限时完整性。
有关详细信息,请参阅CREATE ROLE。
- 回滚
一个命令,用于撤消事务开始以来执行的所有操作。
有关详细信息,请参阅ROLLBACK。
- 例程
存储在数据库系统中的一组已定义的指令,可以调用它们来执行。例程可以用各种编程语言编写。例程可以是函数(包括返回集的函数和触发器函数)、聚合函数和过程。
许多例程在 PostgreSQL 中已经定义,但也可以添加用户定义的例程。
- 行
请参阅元组。
- 保存点
事务 中步骤序列中的一个特殊标记。此时间点之后的数据修改可以还原到保存点的时间。
有关详细信息,请参见 SAVEPOINT。
- 模式
模式是 SQL 对象 的一个命名空间,所有这些对象都位于同一个 数据库 中。每个 SQL 对象必须恰好位于一个模式中。
所有系统定义的 SQL 对象都位于模式
pg_catalog
中。更一般地说,术语 模式 用于表示给定 数据库 或其子集的所有数据描述(表 定义、约束、注释等)。
有关详细信息,请参见 第 5.9 节。
- 段
参见 文件段。
- 选择
用于从 数据库 中请求数据的 命令。通常,
SELECT
命令不会以任何方式修改 数据库,但查询中调用的 函数 可能具有修改数据的副作用。有关详细信息,请参见 SELECT。
- 序列(关系)
用于生成值的某种关系类型。通常,生成的值是连续的非重复数字。它们通常用于生成替代 主键 值。
- 服务器
运行 PostgreSQL 实例 的计算机。术语 服务器 表示实际硬件、容器或 虚拟机。
此术语有时用于指代实例或主机。
- 会话
允许客户端和后端进行交互的状态,通过连接进行通信。
- 共享内存
,由实例中的进程共同使用。它镜像了数据库文件的某些部分,为WAL 记录提供了一个临时区域,并存储其他公共信息。请注意,共享内存属于整个实例,而不属于单个数据库。
共享内存的最大部分称为共享缓冲区,用于镜像部分数据文件,并组织成页面。当一个页面被修改时,它被称为脏页面,直到它被写回文件系统。
有关更多信息,请参阅第 20.4.1 节。
- SQL 对象
可以使用
CREATE
命令创建的任何对象。大多数对象特定于一个数据库,通常称为本地对象。大多数本地对象驻留在其包含的数据库中的特定模式中,例如关系(所有类型)、例程(所有类型)、数据类型等。强制要求同一模式中同类型的此类对象的名称是唯一的。
还存在不驻留在模式中的本地对象;一些示例是扩展、数据类型转换和外部数据包装器。强制要求数据库中同类型的此类对象的名称是唯一的。
其他对象类型,例如 角色、表空间、复制源、逻辑复制订阅以及数据库本身并不是本地 SQL 对象,因为它们完全存在于任何特定数据库之外;它们被称为全局对象。此类对象名称在整个数据库集群中强制唯一。
有关更多信息,请参见第 23.1 节。
- SQL 标准
定义 语言的一系列文档。
- 备用(服务器)
参见 副本(服务器)。
- 启动进程
在崩溃恢复期间和在 物理副本 中重放 WAL 的 辅助进程。
(名称具有历史意义:启动进程在实现复制之前命名;该名称指的是它与服务器在崩溃后启动相关的任务。)
- 超级用户
在此文档中使用时,它是 数据库超级用户 的同义词。
- 系统目录
描述实例的所有 SQL 对象 结构的 表 集合。系统目录驻留在模式
pg_catalog
中。这些表包含内部表示形式的数据,通常不被认为对用户检查有用;许多更友好的 视图,也位于模式pg_catalog
中,提供对其中一些信息的更便捷访问,而其他表和视图存在于模式information_schema
中(参见 第 37 章),它公开 SQL 标准 要求的一些相同和附加信息。有关详细信息,请参见 第 5.9 节。
- 表
具有公共数据结构(相同数量的 属性,按相同顺序,具有相同名称和类型)的 元组 集合。表是 PostgreSQL 中最常见的 关系 形式。
有关更多信息,请参阅 CREATE TABLE。
- 表空间
服务器文件系统上的一个命名位置。所有需要存储(超出其在 系统目录 中的定义)的 SQL 对象 必须属于一个表空间。最初,数据库集群包含一个可用表空间,该表空间用作所有 SQL 对象的默认表空间,称为
pg_default
。有关更多信息,请参阅 第 23.6 节。
- 临时表
在创建时指定的 会话 或 事务 的生命周期内存在的 表。其中的数据对其他会话不可见,并且未 记录。临时表通常用于存储多步骤操作的中间数据。
有关更多信息,请参阅 CREATE TABLE。
- TOAST
一种机制,通过该机制,表行的较大属性被拆分并存储在称为 TOAST 表 的辅助表中。具有较大属性的每个关系都有自己的 TOAST 表。
有关更多信息,请参阅 第 73.2 节。
- 事务
必须作为单个 原子 命令执行的命令组合:它们要么全部成功,要么全部失败,并且在事务完成之前,其效果对其他 会话 不可见,甚至在事务完成之后也不可见,具体取决于隔离级别。
有关更多信息,请参阅 第 13.2 节。
- 事务 ID
每个事务在首次导致数据库修改时收到的数字、唯一、按顺序分配的标识符。通常缩写为 xid。当存储在磁盘上时,xid 只有 32 位宽,因此只能生成大约 40 亿个写事务 ID;为了允许系统运行更长时间,使用了 纪元,它也是 32 位宽。当计数器达到最大 xid 值时,它将从
3
重新开始(该值以下的值是保留的),并且纪元值将增加 1。在某些上下文中,纪元和 xid 值被一起视为单个 64 位值;有关更多详细信息,请参阅 第 74.1 节。有关更多信息,请参阅 第 8.19 节。
- 每秒事务数 (TPS)
在测量运行期间对所有活动会话执行的平均事务数。这用作衡量实例性能特征的指标。
- 触发器
当特定操作(
INSERT
、UPDATE
、DELETE
、TRUNCATE
)应用于关系时,可以定义执行的函数。触发器在与调用它的语句相同的事务中执行,如果函数失败,则调用语句也会失败。有关更多信息,请参阅CREATE TRIGGER。
- 元组
按固定顺序排列的属性集合。该顺序可以由包含元组的表(或其他关系)定义,在这种情况下,元组通常称为行。它也可以由结果集的结构定义,在这种情况下,它有时称为记录。
- 唯一约束
在关系上定义的一种约束,它限制了允许在单列或多列组合中出现的数值,以便每个数值或数值组合只能在关系中出现一次,即关系中的其他行不包含等于它们的数值。
由于Null 值不被视为彼此相等,因此允许存在多个具有 Null 值的行,而不会违反唯一约束。
- 未记录
某些关系的属性,即对它们的更改不会反映在WAL中。这会禁用这些关系的复制和崩溃恢复。
未记录表的首要用途是存储必须在进程之间共享的瞬态工作数据。
临时表始终未记录。
- 更新
用于修改可能已存在于指定表中的行的命令。它不能创建或删除行。
有关更多信息,请参阅 UPDATE。
- 用户
- 用户映射
将本地 数据库 中的登录凭证转换为由 外部数据包装器 定义的远程数据系统中的凭证。
有关更多信息,请参阅 CREATE USER MAPPING。
- Vacuum
从表或物化视图中删除过时的 元组版本 的过程,以及 PostgreSQL 实现的 MVCC 所需的其他密切相关的处理。这可以通过使用
VACUUM
命令来启动,但也可以通过 自动真空 进程自动处理。有关更多信息,请参阅 第 25.1 节。
- 视图
由
SELECT
语句定义的 关系,但没有自己的存储。任何时候查询引用视图时,视图的定义都会替换到查询中,就好像用户将其作为子查询而不是视图名称键入一样。有关更多信息,请参阅 CREATE VIEW。
- 可见性映射(分支)
存储结构,其中保留有关表主分支的每个数据页的元数据。每个页面的可见性映射条目存储两个位:第一个位 (
all-visible
) 指示页面中的所有元组对所有事务都可见。第二个位 (all-frozen
) 指示页面中的所有元组都标记为冻结。- WAL
参见 预写式日志。
- WAL 归档器(进程)
一种 辅助进程,如果启用,则会保存 WAL 文件 的副本,以便创建备份或保持 副本 的最新状态。
有关更多信息,请参见 第 26.3 节。
- WAL 文件
也称为 WAL 段 或 WAL 段文件。按顺序编号的文件,为 WAL 提供存储空间。这些文件大小均预先定义,并按顺序写入,穿插多个同时会话中发生的更改。如果系统崩溃,则按顺序读取这些文件,并重放每个更改,以将系统恢复到崩溃前的状态。
在 检查点 将其中的所有更改写入相应的数据文件后,可以释放每个 WAL 文件。通过删除文件或更改其名称以供将来使用(称为 回收)来释放文件。
有关更多信息,请参见 第 30.6 节。
- WAL 记录
对单个数据更改的底层描述。它包含足够的信息,以便在系统故障导致更改丢失的情况下重新执行(重放)数据更改。WAL 记录使用不可打印的二进制格式。
有关更多信息,请参见 第 30.6 节。
- WAL 接收器(进程)
一种 辅助进程,在 副本 上运行,从 主服务器 接收 WAL,以便 启动进程 重放。
有关更多信息,请参见 第 27.2 节。
- WAL 段
请参阅WAL 文件。
- WAL 发送器(进程)
一个特殊的 后端进程,通过网络流式传输 WAL。接收端可以是 WAL 接收器(在 副本 中)、pg_receivewal 或任何其他使用复制协议的客户端程序。
- WAL 写入器(进程)
一个进程,将 WAL 记录 从 共享内存 写入 WAL 文件。
有关详细信息,请参阅 第 20.5 节。
- 窗口函数(例程)
一种 函数类型,用于 查询,该查询应用于查询 分区 的 结果集;该函数的结果基于同一分区或框架的 行 中找到的值。
所有 聚合函数 都可以用作窗口函数,但窗口函数还可以用于(例如)对分区中的每一行进行排名。也称为 分析函数。
有关详细信息,请参阅 第 3.5 节。
- 预写日志
当用户和系统调用的操作发生时,跟踪 数据库集群 中更改的日志。它包含许多单独的 WAL 记录,按顺序写入 WAL 文件。