↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12
开发快照。 PostgreSQL 20devel 尚未正式发布,内容仍可能变化。

pg_checksums

pg_checksums — 在 PostgreSQL 数据库集簇中启用、禁用或检查数据校验和

大纲

pg_checksums [option...] [ [ -D | --pgdata ] datadir ]

描述

pg_checksums 用于在 PostgreSQL 数据库集簇中检查、启用或禁用数据校验和。运行 pg_checksums 之前,必须先将服务器干净关闭。也可以在集簇运行期间启用校验和,具体过程见 Online Enabling of Checksums;有关不同方法的更多细节,参见第 28.2 节。验证校验和时,如果没有校验和错误,则退出状态为零;如果检测到至少一个校验和失败,则退出状态为非零。启用或禁用校验和时,如果操作失败,则退出状态为非零。

如果集簇关闭时正处于 Online Enabling of Checksums 所述的在线启用或禁用校验和的过程中,控制文件仍会记录该中断状态,pg_checksums 将拒绝以任何模式运行。请启动集簇并将其干净关闭以重置该状态,然后重试;在备库上,请先让复制完成该转换。

在验证校验和时,集簇中的每个文件都会被扫描。启用校验和时,校验和发生变化的每个关系文件块都会被原地重写。禁用校验和只会更新文件 pg_control。

选项

提供以下命令行选项:

-D datadir
--pgdata=datadir #

指定存储数据库集簇的目录。

-c
--check #

检查校验和。如果没有指定其他模式,这是默认模式。

-d
--disable #

禁用校验和。

-e
--enable #

启用校验和。

-f filenode
--filenode=filenode #

仅验证文件节点为 filenode 的关系中的校验和。

-N
--no-sync #

默认情况下,pg_checksums 会等待所有文件被安全写入磁盘。该选项会使 pg_checksums 直接返回而不等待,这样速度更快,但也意味着如果随后操作系统崩溃,更新后的数据目录可能会损坏。通常,此选项适合测试,但不应在生产环境中使用。使用 --check 时,此选项不起作用。

-P
--progress #

启用进度报告。启用此选项后,在检查或启用校验和时会输出进度报告。

--sync-method=method #

设为 fsync(默认值)时,pg_checksums 会递归打开并同步数据目录中的所有文件。查找文件时会跟随 WAL 目录和每个已配置表空间的符号链接。

在 Linux 上,也可以改用 syncfs,请求操作系统同步包含数据目录、WAL 文件以及每个表空间的整个文件系统。使用 syncfs 时需注意的事项见 recovery_init_sync_method。

使用 --no-sync 时,此选项不起作用。

-v
--verbose #

启用详细输出,列出所有被检查的文件。

-V
--version #

打印 pg_checksums 版本并退出。

-?
--help #

显示关于 pg_checksums 命令行参数的帮助并退出。

环境

PGDATA #

指定存储数据库集簇的目录;可以用 -D 选项覆盖。

PG_COLOR #

指定诊断消息是否使用颜色。可选值为 always、auto 和 never。

注解

在大型集簇中启用校验和可能需要很长时间。在此操作期间,不得启动该集簇,也不得启动任何会向数据目录写入内容的其他程序,否则可能发生数据丢失。

使用 pg_checksums 启用或禁用校验和只会更改本地数据目录;新状态不会被复制到任何其他节点。在复制环境中,必须对每个节点应用相同的更改:

  1. 关闭所有节点

    参与复制的所有节点都必须以干净关闭的方式停止;pg_checksums 拒绝在立即关闭后遗留的数据目录上运行。在停止备库之前,确保它已重放主库的所有 WAL:先停止主库,用 pg_controldata 读取其“Latest checkpoint location”(最新检查点位置),并检查备库上的 pg_last_wal_replay_lsn() 是否已推进到超过它。仅比较重放位置与 pg_last_wal_receive_lsn() 是不够的,因为后者只表明备库已接收的 WAL 已被重放。

  2. 在每个节点上启用或禁用数据校验和

    在复制环境中每个节点的数据目录上运行 pg_checksums。各节点可以在停机期间并行处理。必须所有节点都成功完成处理后才能继续。

  3. 重启所有节点

    正常启动各节点,验证 data_checksums 在所有节点上一致,并监视各备库的日志中是否出现数据校验和状态不匹配的警告。

步骤 1 中的重放要求存在的原因是:离线更改只记录在控制文件中,相对于节点尚未重放的 WAL 没有确定的顺序;见第 28.2.1 节。在重放在线校验和状态更改之前停止的节点,会在重新启动时应用该更改,覆盖离线更改,各节点的状态会悄然分叉,直到稍后的检查点记录触发下述警告。因此,最好不要混用这两种机制:要么用上面的离线流程更改复制环境的状态,要么用在线转换,并确保在上一次更改到达每个节点之后再开始下一次更改。

如果更改的应用不一致,每个节点都会保持自己的状态,当重放的 WAL 中记录的状态与自身状态不同时,备库会记录一条警告。在备库通过重放 WAL 追赶进度时,如果所重放的 WAL 写于该更改被一致应用之前,也可能短暂出现同样的警告;一旦携带新状态的检查点记录被重放,警告就会停止。

如果备库的数据目录从未计算过校验和,就不得通过这种追赶方式启用校验和。请按上文所述在备库停机时对其运行 pg_checksums、在线启用校验和,或者从基础备份重建它,以使集簇的校验和状态一致。注意,在线启用只能从校验和处于关闭状态的主库开始,因此如果主库上已经启用,请先在线禁用。

如果在启用或禁用校验和期间 pg_checksums 被中止或杀掉,那么集簇的数据校验和配置将保持不变,并且可以重新运行 pg_checksums 以执行同一操作。

诸如 pg_rewind 这类会在节点之间直接复制关系文件块的工具,要求所有节点处于相同的数据校验和状态,否则存在数据损坏的风险。

目标集簇必须与 pg_checksums 具有相同的主版本。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.