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

相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
提子拌饭1332 小时前
风息时钟:鸿蒙Flutter 实现的自然风格时钟应用
flutter·华为·架构·开源·harmonyos
墨染天姬5 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
2501_948114246 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
小小工匠6 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
迷藏4946 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源