编程 initdb 初始化集群:排序规则与 trust 认证建完就改不动

2026-10-14 23:42:30

initdb 初始化集群:排序规则与 trust 认证建完就改不动

initdb 创建一个新的 PostgreSQL 数据库集群,语法为 initdb [option...] [--pgdata|-D] directory。数据目录没有默认位置,常见的是 /var/lib/pgsql/data。

目录必须为空,权限按 0700/0600

必须用 PostgreSQL 用户账号执行:

$ initdb -D /usr/local/pgsql/data

也可以设置 PGDATA 环境变量,或让 pg_ctl 转发:

$ pg_ctl -D /usr/local/pgsql/data initdb

父目录不可写时,先用 root 建目录再切换到 postgres 用户:

mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su postgres

initdb 拒绝在目录已存在且包含文件时运行,也就是数据目录必须为空,或者干脆指向一个还不存在的目录。这一点直接决定了重新初始化的姿势:没有就地清空重来的选项,只能把内容删干净再跑一次。

权限方面,默认只有所有者能访问:数据目录 0700、文件 0600。需要同组用户读取时用 -g/--allow-group-access 打开组读,对应目录 0750、文件 0640。Windows 上忽略该设置。

locale、排序规则与 locale provider

initdb 同时初始化集群的默认 locale 与字符集编码。locale 通常继承环境变量。非 C/POSIX locale 有性能代价,依赖 locale 的排序和字符分类(大小写转换等)都会比 C 慢,代价落在每一次比较上。

集群默认排序规则由 initdb 写入 template1,之后从 template1 复制出来的库都继承它。一旦建库,排序规则就改不动了,除非删除并重建 template1——实际等于重新初始化。用 --locale 指定整体 locale,或用 --lc-collate / --lc-ctype 只设特定范畴:

$ initdb -D /usr/local/pgsql/data --locale=zh_CN.UTF-8

locale provider 用 --locale-provider={builtin|libc|icu} 选择,默认 libc。选 ICU 时配合 --icu-locale 指定 locale、--icu-rules 定制排序规则:

$ initdb -D /usr/local/pgsql/data \
    --locale-provider=icu \
    --icu-locale=zh-CN \
    -E UTF8

编码用 -E encoding 指定模板库编码,需要与所选 locale 匹配,不匹配时 initdb 会直接报错。

默认 trust 认证

initdb 生成的 pg_hba.conf 默认使用 trust 认证:本机任意用户都能连上集群,甚至可以以超级用户身份登录。机器只要不是完全私有的,这个默认值就不能留。

几种处理方式。用 -A 直接指定认证方法写进 pg_hba.conf:

$ initdb -D /usr/local/pgsql/data -A scram-sha-256

用 -W/--pwprompt 交互式设置超级用户口令,或用 --pwfile 从文件读取:

$ initdb -D /usr/local/pgsql/data -A scram-sha-256 -W
$ initdb -D /usr/local/pgsql/data -A scram-sha-256 --pwfile=/tmp/pw

也可以两个都不管,在首次启动之前手工改 pg_hba.conf。

引导超级用户的名称用 -U username 指定,默认取当前系统用户名。

重新初始化

换 locale 或 provider 没有就地修改的办法:停库、清空数据目录、重新 initdb。

$ pg_ctl -D /usr/local/pgsql/data stop
$ rm -rf /usr/local/pgsql/data/*
$ initdb -D /usr/local/pgsql/data \
    --locale-provider=icu --icu-locale=zh-CN \
    -E UTF8 -A scram-sha-256 -W

--wal-segsize 也只在初始化时能设:默认 16MB,取值为 1~1024MB 之间的 2 的幂,初始化之后不可更改。

选项速查

  • -A authmethod:写入 pg_hba.conf 的认证方法
  • -D, --pgdata:集群目录
  • -E encoding:模板库编码
  • -g, --allow-group-access:允许同组读
  • --icu-locale、--icu-rules:ICU locale 与排序规则
  • --locale=locale:整体 locale
  • --lc-collate、--lc-ctype:只设特定范畴
  • --locale-provider={builtin|libc|icu}:默认 libc
  • -U username:引导超级用户
  • -X, --waldir:WAL 目录
  • --wal-segsize:默认 16MB,1~1024MB 的 2 的幂,仅初始化可设
  • -c name=value, --set:设置参数
  • -L:共享库目录
  • -n, --no-clean:出错时保留文件,便于调试
  • -N, --no-sync:测试用,跳过同步
  • --sync-method
  • -S, --sync-only
  • -T, --text-search-config
  • --no-locale

初始化完成后,集群里包含 postgres 与 template1 两个数据库。

参考

推荐文章

程序员茄子在线接单