↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

3.2. 创建数据库集簇 #

在做任何事情之前,必须先在磁盘上初始化一个数据库存储区域。我们把它称为数据库集簇。(SQL 标准则说目录集簇。)数据库集簇是一组可通过单个运行中的数据库服务器实例访问的数据库。初始化之后,数据库集簇会包含一个名为 template1 的数据库。顾名思义,它会作为后续新建数据库的模板;不应将它用于实际工作。

从文件系统角度看,数据库集簇就是一个目录,所有数据都存储在其下。我们将它称为数据目录或数据区域。数据存放位置完全由你决定,没有默认值,不过诸如 /usr/local/pgsql/data 或 /var/lib/pgsql/data 这样的位置比较常用。要初始化数据库集簇,请使用随 PostgreSQL 一起安装的命令 initdb。数据库系统在文件系统中的目标位置通过 -D 选项指定,例如

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

注意,必须以 PostgreSQL 用户账户登录后再执行此命令,该账户已在上一节介绍。

提示

除了使用 -D 选项,也可以设置环境变量 PGDATA。

如果指定的目录尚不存在,initdb 会尝试创建它。它很可能没有这样做的权限(如果你听从了我们的建议,创建的是非特权账户)。这种情况下,你应该(以 root 身份)自行创建该目录,并将其所有权转移给 PostgreSQL 用户账户。过程可能如下:

root# mkdir /usr/local/pgsql/data
root# chown postgres /usr/local/pgsql/data
root# su postgres
postgres$ initdb -D /usr/local/pgsql/data

如果数据目录看起来属于一个已经初始化过的安装,initdb 将拒绝运行。

由于数据目录包含存储在数据库中的全部数据,必须妥善保护它免遭未经授权的访问。因此,initdb 会撤销除 PostgreSQL 用户账户以外所有人的访问权限。

不过,尽管目录内容是安全的,pg_hba.conf 默认的 trust 认证方法却允许任何本地用户连接到数据库,甚至成为数据库超级用户。如果你不信任其他本地用户,我们建议使用 initdb 的 -W 或 --pwprompt 选项为数据库超级用户指定口令。运行 initdb 之后,在首次启动服务器之前修改 pg_hba.conf,把 trust 认证改为 md5 或 password。(其他可能更方便的方法包括使用 ident 认证或文件系统权限来限制连接。更多信息见第 4 章。)

运行 initdb 时你可能遇到的一个意外是类似这样的通知:

NOTICE:  Initializing database with en_US collation order.
        This locale setting will prevent use of index optimization for
        LIKE and regexp searches.  If you are concerned about speed of
        such queries, you may wish to set LC_COLLATE to "C" and
        re-initdb.  For more information see the Administrator's Guide.

此通知是为了警告你,当前选择的区域设置会导致索引按某种顺序排序,使它们无法用于 LIKE 和正则表达式搜索。如果你需要这类搜索的良好性能,应当把当前区域设置改为 C 并重新运行 initdb。在大多数系统上,设置当前区域设置的方法是更改环境变量 LC_ALL 或 LANG 的值。特定数据库集簇中使用的排序顺序由 initdb 设置,事后无法更改,除非转储全部数据、重新运行 initdb 再重新装载数据。因此,现在就作出正确选择很重要。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.