Postgres 18 默认开启数据校验及升级应对方案

在 Greg Sabino Mullane 编写的最新 Postgres 补丁中,Postgres 对数据完整性机制进行了调整:从 Postgres 18 开始,数据校验(data checksum)功能默认启用

这一变更在发布说明中看起来只是一个相对较小的调整,但针对的是数据库运行过程中较难察觉的风险之一---静默数据损坏(silent data corruption),对系统可靠性具有实际意义。

本文对数据校验的工作机制、默认行为的变化,以及升级过程中需要关注的问题进行简要说明。

什么是 data checksum

数据校验(data checksum)是一种简单但非常有效的技术,用于验证存储在磁盘上的数据页完整性。该功能相当于为数据库内每个 8KB 数据块(即 "数据页")生成专属的数字指纹。

其工作机制如下:

  • 生成机制 :当 Postgres 将数据页(包含表与索引数据)写入磁盘时,系统会对数据页内容执行特定算法计算,生成一个简短的衍生数值,即校验值
  • 存储方式:生成的校验和会与数据一同存储在数据页头部。
  • 校验流程:当 Postgres 从磁盘读取该数据页时,会立即基于读取的内容重新计算校验值,并与存储的数值进行比对。

若两次计算的数值不一致,则表明该数据页自上次写入后已发生篡改或损坏。这一校验机制至关重要,原因在于数据损坏可能以静默形式发生。一旦检测到数值不匹配,PostgreSQL 会立即抛出错误,以此警示潜在的数据问题。此外,校验和还是 pgBackRest 工具的核心组成部分,该工具借助校验和完成备份文件的完整性验证。

什么是 initdb,它为什么重要

initdb 是 Postgres 中用于创建新的数据库集群的工具,用于初始化 Postgres 存放所有永久数据的数据目录。执行 initdb 命令时,系统将完成以下操作:

  1. 创建数据目录结构;
  2. 创建 template1postgres 等模板数据库;
  3. 填充初始系统目录表;
  4. 创建服务器配置文件的初始版本;
  5. 启用并开始记录数据校验值。

其调用形式通常如下:

复制代码
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

对于使用云托管 Postgres 服务或使用 Postgres.app 等本地工具的用户而言,通常无需直接执行 initdb 命令,因其属于一次性的管理员配置操作。

initdb 命令的新默认参数:--data-checksums

在以往的版本中,数据库管理员需在执行 initdb 命令时手动添加 --data-checksums 参数,才能启用数据校验。如果忘记添加该参数,或并不了解这一特性,新建集群将不会启用内建的数据完整性校验机制。

如今,initdb 命令的默认行为已变更为在每次初始化 PostgreSQL 时自动启用数据校验功能。

  • 旧版命令(默认关闭数据校验):
    initdb -D /data/pg14
  • 新版默认命令(默认开启数据校验):
    initdb -D /data/pg18

此项变更符合 PostgreSQL 最佳实践规范。所有新建数据库集群将自动具备数据损坏防御能力,无需管理员执行额外操作。

--no-data-checksums 参数

在某些特定场景下,可能需要显式关闭数据校验值机制,此时可以使用新增的参数:

复制代码
initdb --no-data-checksums -D /data/pg18

数据校验与 pg_upgrade

尽管新默认值的设定具备显著优势,但对于使用 pg_upgrade 工具执行大版本升级的场景,可能引发兼容性问题。

pg_upgrade 工具的工作原理是将旧版本数据目录与新版本数据目录建立关联,其核心要求为新旧两个数据库集群的校验和配置必须保持一致,即同时开启或同时关闭。

若待升级的旧版 PostgreSQL 集群创建于该功能变更之前,其校验功能大概率处于关闭状态,此时执行 pg_upgrade 升级操作会因配置不匹配而失败。

在紧急升级场景下,若需对未启用校验和的旧集群执行升级,管理员可在初始化新集群时添加 --no-data-checksums 参数,使新旧集群的配置保持一致。

为现有 Postgres 数据库启用数据校验

相比长期运行在未启用数据校验的状态下,更合理的做法是在下一次升级前为数据库补充这一机制。然而,目前并不存在无需停机即可完成该操作的方式。为已有数据库启用数据校验需要停机并重启实例,在数据库规模较大的情况下,该过程可能较为缓慢。

Postgres 提供了 pg_checksums 工具用于完成这一操作,并且相关文档已有较为完整的说明。

在对可用性要求较高的环境中,可以先在副本节点上启用数据校验值,再通过故障切换的方式完成迁移。

结语

数据校验是 Postgres 中一项非常有价值的特性,并已成为新的默认配置。对于此前尚未启用该机制的数据库,应尽早规划启用方案,尤其是在自管理环境进行主版本升级时,需要提前考虑由此带来的升级与兼容性影响。

原文链接:

https://www.crunchydata.com/blog/postgres-18-new-default-for-data-checksums-and-how-to-deal-with-upgrades

作者:Greg Sabino Mullane

相关推荐
NAGNIP3 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab5 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab5 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP8 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年8 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼9 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS9 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区10 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈10 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang11 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx