为 PostgreSQL 数据库开启 Data Checksums 功能
后知后觉 暂无评论

为了防范 Silent Data Corruption (静默数据损坏),保障数据完整性。

背景

开启 Data Checksums 需要在初始化数据库时开启,如果已经初始化数据,无法再开启这个功能。

开启校验

为了已经初始化的数据库开启数据校验功能需要先停止服务,然后使用 pg_checksums 命令来对已经初始化的数据库开启数据校验。

在 v18 版本之后的数据库会默认开启本功能,之前的版本需要手动开启,查询功能开启状态可以执行(返回 onoff):

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"

附录

参考链接

如果遇到问题或者对文章内容存疑,请在下方留言,博主看到后将及时回复,谢谢!
回复 / 查看「历史评论