为了防范 Silent Data Corruption (静默数据损坏),保障数据完整性。
背景
开启 Data Checksums 需要在初始化数据库时开启,如果已经初始化数据,无法再开启这个功能。
开启校验
为了已经初始化的数据库开启数据校验功能需要先停止服务,然后使用 pg_checksums 命令来对已经初始化的数据库开启数据校验。
在 v18 版本之后的数据库会默认开启本功能,之前的版本需要手动开启,查询功能开启状态可以执行(返回 on 或 off):
SHOW data_checksums;如果当前数据库存在坏快会导致开启失败,可以先执行检查命令:
pg_checksums -D /var/lib/postgresql/data --check常规环境
如果使用发行版或者官方仓库安装的 PostgreSQL 服务,需要先彻底停止服务,保证没有数据写入。
sudo systemctl status postgresql然后使用内置工具开启 Data Checksums 功能(假定数据目录为 /var/lib/postgresql/data):
pg_checksums -D /var/lib/postgresql/data --enable --progress需要提前安排停机窗口,开启数据校验功能耗时和数据量正相关。
容器环境
如果使用容器运行,需要先停止容器服务,然后使用相同版本的镜像挂载原数据库的数据卷执行命令(以 compose 为例):
docker compose run --rm --no-deps \
--user postgres \
postgres \
pg_checksums --enable --progress \
-D /var/lib/postgresql/data然后可以看到信息提示:
[+] 1/1te 1/1
✔ Network networks Created 0.0s
Container database-postgres-run-5db17f7fb83e Creating
Container database-postgres-run-5db17f7fb83e Created
25263/25263 MB (100%) computed
Checksum operation completed
Files scanned: 12693
Blocks scanned: 3281582
Files written: 10521
Blocks written: 3281564
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster对于 compose 环境,如果初次使用可以添加启动参数来启用这个功能:
services:
postgres:
container_name: postgres
image: postgres:16.15-alpine3.23
shm_size: '256m'
ports:
- "127.0.0.1:5432:5432"
environment:
POSTGRES_INITDB_ARGS: "--data-checksums"附录
参考链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2026-08-31 02:14 AM