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

相关推荐
GitCode官方11 小时前
AtomGit 8 月:应用市场 App 上线、首页与工作台双改版、14 组织 32 项目加入 G-Star、五城 Meetup 收官
开源·atomgit
hacker70711 小时前
DBeaver Community 鸿蒙 PC 适配全记录:在 HarmonyOS PC 上运行原生数据库管理工具
数据库·华为·harmonyos
蓝速科技11 小时前
涉外酒店前台双屏翻译机落地应用指南
运维·人工智能·科技·语言模型·自然语言处理·语音识别
Databuff11 小时前
PuTTY 工具的开源平替来了,免费使用
运维·开源·ssh·开源软件
AI 思录11 小时前
Prompt 事故档案(九):AI安抚话术大全——当“态度好“成为“不改“的遮羞布
大数据·人工智能·安全·prompt·用户运营·用户体验
X54先生(人文科技)11 小时前
《元创力》纪实录 · 桥段 3.5-D《第一次协议的遗址》
人工智能·深度学习·架构·开源·ai写作
中视会议11 小时前
从 AI 深度交流到精准相亲匹配:实时音视频如何重构婚恋服务
大数据·人工智能·大模型应用·视频交友·ai相亲
TAN-90°-11 小时前
Deep Learning for Computer Vision——Large Scale Distributed Training
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·语言模型
天远数科11 小时前
零信任架构实战:基于天远企业四要素验证构建自动化高并发金融科技商户收单网关
人工智能·金融·架构·自动化
不会写代码的女程序猿12 小时前
明理 AI 四诊仪到底有哪些优势?
大数据·人工智能·科技·ai·健康医疗