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 两个数据库。