pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
在做任何事情之前,必须先在磁盘上初始化一个数据库存储区域。我们把它称为数据库集簇。(SQL 标准使用术语目录集簇(catalog cluster)。)数据库集簇是由单个运行中的数据库服务器实例访问的一组数据库。初始化之后,数据库集簇中会包含一个名为template1的数据库。顾名思义,它会作为后续新建数据库的模板;不应将它用于实际工作。(关于创建数据库的信息,见第 5 章。)
从文件系统角度看,数据库集簇就是一个目录,所有数据都存储在其下。我们将它称为数据目录或数据区域。数据存放位置完全由你决定,没有默认值,不过诸如/usr/local/pgsql/data或/var/lib/pgsql/data这样的位置比较常用。要初始化数据库集簇,请使用随 PostgreSQL 一起安装的命令initdb。数据库系统在文件系统中的目标位置通过 -D 选项指定,例如:
$initdb -D /usr/local/pgsql/data
注意,必须以 PostgreSQL 用户账户登录后再执行此命令,该账户已在上一节介绍。
如果指定的目录尚不存在,initdb 会尝试创建它。它很可能没有这样做的权限(如果你听从了我们的建议,创建的是非特权账户)。这种情况下,你应该(以 root 身份)自行创建该目录,并将其所有者改为 PostgreSQL 用户。过程可能如下所示:
root#mkdir /usr/local/pgsql/dataroot#chown postgres /usr/local/pgsql/dataroot#su postgrespostgres$initdb -D /usr/local/pgsql/data
如果数据目录看起来已经被初始化过,initdb 将拒绝运行。
由于数据目录包含存储在数据库中的全部数据,必须保护它免遭未经授权的访问。因此,initdb 会撤销除 PostgreSQL 用户以外所有人的访问权限。
不过,尽管目录内容是安全的,默认的客户端认证设置却允许任何本地用户连接到数据库,甚至成为数据库超级用户。如果你不信任其他本地用户,我们建议使用 initdb 的 -W 或 --pwprompt 选项为数据库超级用户指定口令。运行 initdb 之后,在首次启动服务器之前修改 pg_hba.conf 文件,把 trust 认证改为 md5 或 password。(其他方法包括使用 ident 认证或文件系统权限来限制连接。更多信息见第 6 章。)
initdb 还会初始化数据库集簇的默认区域设置。通常,它会直接采用环境中的区域设置,并将其应用于初始化的数据库。可以为数据库指定不同的区域设置;更多信息见 第 7.1 节。运行 initdb 时你可能遇到的一个意外是类似这样的通知:
The database cluster will be initialized with locale de_DE. This locale setting will prevent the use of indexes for pattern matching operations. If that is a concern, rerun initdb with the collation order set to "C". For more information see the Administrator's Guide.
这是为了警告你,当前选择的区域设置会导致索引按某种顺序排序,使它们无法用于 LIKE 和正则表达式搜索。如果你需要这类搜索的良好性能,应当把当前区域设置改为 C 并重新运行 initdb,例如运行 initdb --lc-collate=C。特定数据库集簇中使用的排序顺序由 initdb 设置,事后无法更改,除非转储全部数据、重新运行 initdb 再重新装载数据。因此,一开始就作出正确选择很重要。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。