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

相关推荐
Akamai中国2 小时前
Akamai Cloud客户案例 | Avesha 在 Akamai 云上扩展 Kubernetes 解决方案
人工智能·云计算·云服务·云存储
梦帮科技2 小时前
第二十三篇:自然语言工作流生成:GPT-4集成实战
人工智能·python·机器学习·开源·gpt-3·极限编程
申耀的科技观察2 小时前
【观察】用AI“手术刀”开启智慧医疗,看AI“生产线”赋能千行百业
人工智能
天天向上10242 小时前
gin将响应的时间格式化 YYYY-MM-DD HH:MM:SS
数据库·oracle·gin
Deepoch2 小时前
基于PPO强化学习的无人机自主路径规划技术实践
人工智能·机器人·无人机·具身模型·deepoc·deepoc具身智能开拓版
Mr_Xuhhh2 小时前
有关LangChain
人工智能·深度学习·神经网络
电商API_180079052472 小时前
数据驱动商品运营:电商 SKU 生命周期数据分析与优化策略
大数据·数据库·人工智能
胡伯来了2 小时前
13 Transformers - 使用Pipelien处理自然语言处理
人工智能·自然语言处理·nlp·transformer·transformers
qq_463408422 小时前
React Native跨平台技术在开源鸿蒙中使用内置的`fetch` API或者第三方库如`axHarmony`来处理网络通信HTTP请求
javascript·算法·react native·react.js·http·开源·harmonyos