支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

18.2. 创建数据库集群 #

在您可以做任何事情之前,您必须在磁盘上初始化一个数据库存储区域。我们称之为数据库集群。(SQL标准使用术语“目录集群”。)数据库集群是由正在运行的数据库服务器的单个实例管理的数据库集合。初始化后,数据库集群将包含一个名为postgres的数据库,它旨在作为实用程序、用户和第三方应用程序使用的默认数据库。数据库服务器本身不需要postgres数据库存在,但是许多外部实用程序假设它存在。在初始化期间,每个集群中还创建了另外两个数据库,分别名为template1template0。顾名思义,这些将用作后续创建的数据库的模板;它们不应该用于实际工作。(有关在集群中创建新数据库的信息,请参阅第 22 章。)

在文件系统术语中,数据库集群是一个单独的目录,所有数据都将存储在该目录下。我们称之为数据目录数据区域。完全由您来选择存储数据的位置。没有默认位置,尽管像/usr/local/pgsql/data/var/lib/pgsql/data这样的位置很受欢迎。必须先初始化数据目录才能使用,这要使用随PostgreSQL安装的程序initdb

如果您正在使用预打包版本的PostgreSQL,它很可能对数据目录的放置位置有特定的约定,并且它可能还提供了一个用于创建数据目录的脚本。在这种情况下,您应该优先使用该脚本,而不是直接运行initdb。有关详细信息,请参阅软件包级别的文档。

要手动初始化数据库集群,请运行initdb,并使用-D选项指定数据库集群所需的文件系统位置,例如

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

请注意,您必须在登录到PostgreSQL用户帐户时执行此命令,该用户帐户在上一节中进行了描述。

提示

作为-D选项的替代方法,您可以设置环境变量PGDATA

或者,您可以通过pg_ctl程序运行initdb,如下所示

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

如果您正在使用pg_ctl启动和停止服务器(请参阅第 18.3 节),这可能更直观,这样pg_ctl将是您用于管理数据库服务器实例的唯一命令。

如果指定目录不存在,initdb将尝试创建该目录。当然,如果initdb没有在父目录中写入的权限,这将失败。通常建议PostgreSQL用户不仅拥有数据目录,而且还拥有其父目录,这样就不应该出现问题。如果所需的父目录也不存在,您将需要首先创建它,如果祖父目录不可写,则使用 root 权限。因此,该过程可能如下所示

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

如果数据目录存在并且已经包含文件,initdb将拒绝运行;这是为了防止意外覆盖现有安装。

由于数据目录包含存储在数据库中的所有数据,因此必须保护它免受未经授权的访问。initdb因此会撤销除PostgreSQL用户(可选,组)之外的所有人的访问权限。启用组访问后,该组具有只读权限。这允许与集群所有者位于同一组中的非特权用户备份集群数据或执行其他仅需要读取访问的操作。

请注意,在现有集群上启用或禁用组访问需要关闭集群,并在重新启动PostgreSQL之前在所有目录和文件上设置适当的模式。否则,数据目录中可能存在混合模式。对于仅允许所有者访问的集群,目录的适当模式为0700,文件的适当模式为0600。对于还允许组读取的集群,目录的适当模式为0750,文件的适当模式为0640

但是,虽然目录内容是安全的,但默认的客户端身份验证设置允许任何本地用户连接到数据库,甚至成为数据库超级用户。如果您不信任其他本地用户,我们建议您使用initdb-W--pwprompt--pwfile 选项之一为数据库超级用户分配密码。 此外,指定-A scram-sha-256,这样就不会使用默认的trust身份验证模式;或者在运行initdb后修改生成的pg_hba.conf文件,但您首次启动服务器之前。(其他合理的方法包括使用peer身份验证或文件系统权限来限制连接。有关更多信息,请参阅第 20 章。)

initdb还会初始化数据库集群的默认区域设置。通常,它只会获取环境中的区域设置并将其应用于初始化的数据库。可以为数据库指定不同的区域设置;有关此内容的更多信息,请参见第 23.1 节initdb设置在特定数据库集群中使用的默认排序顺序,虽然您可以使用不同的排序顺序创建新数据库,但是如果没有删除和重新创建模板数据库,则无法更改initdb创建的模板数据库中使用的顺序。使用CPOSIX以外的区域设置也会对性能产生影响。因此,第一次正确做出此选择非常重要。

initdb还会为数据库集群设置默认字符集编码。通常,应选择此项以匹配区域设置。有关详细信息,请参见第 23.3 节

C和非POSIX区域设置依赖于操作系统的排序库进行字符集排序。这将控制存储在索引中的键的排序。因此,集群无法通过快照还原、二进制流复制、不同的操作系统或操作系统升级切换到不兼容的排序库版本。

18.2.1. 二级文件系统的使用 #

许多安装会在机器的卷以外的文件系统(卷)上创建其数据库集群。如果您选择这样做,不建议尝试将辅助卷的顶层目录(挂载点)用作数据目录。最佳做法是在挂载点目录中创建一个由PostgreSQL用户拥有的目录,然后在其中创建数据目录。这可以避免权限问题,特别是对于诸如pg_upgrade之类的操作,并且它还可以确保在辅助卷脱机时干净地失败。

18.2.2. 文件系统 #

通常,任何具有 POSIX 语义的文件系统都可以用于 PostgreSQL。用户出于各种原因选择不同的文件系统,包括供应商支持、性能和熟悉程度。经验表明,在其他条件相同的情况下,仅仅通过切换文件系统或对文件系统进行少量配置更改,不应期望会带来重大的性能或行为变化。

18.2.2.1. NFS #

可以使用NFS文件系统来存储 PostgreSQL 数据目录。PostgreSQLNFS文件系统不做特殊处理,这意味着它假设NFS的行为与本地连接的驱动器完全相同。PostgreSQL 不使用任何已知在NFS上具有非标准行为的功能,例如文件锁定。

使用NFSPostgreSQL 的唯一硬性要求是文件系统必须使用 hard 选项挂载。 使用 hard 选项,如果出现网络问题,进程可以无限期地“挂起”,因此这种配置需要仔细的监控设置。soft 选项会在出现网络问题时中断系统调用,但是 PostgreSQL 不会重复以这种方式中断的系统调用,因此任何此类中断都会导致报告 I/O 错误。

没有必要使用 sync 挂载选项。async 选项的行为就足够了,因为 PostgreSQL 会在适当的时候发出 fsync 调用来刷新写缓存。(这类似于它在本地文件系统上的工作方式。)但是,强烈建议在存在 sync 导出选项的系统(主要是 Linux)上的 NFS 服务器上使用该选项。否则,NFS 客户端上的 fsync 或等效操作实际上不能保证到达服务器上的永久存储,这可能会导致类似于关闭参数 fsync 运行时的损坏。这些挂载和导出选项的默认值因供应商和版本而异,因此建议在任何情况下都检查并可能显式指定它们,以避免任何歧义。

在某些情况下,可以通过 NFS 或更底层的协议(例如 iSCSI)访问外部存储产品。在后一种情况下,存储显示为块设备,可以在其上创建任何可用的文件系统。这种方法可能使 DBA 不必处理 NFS 的一些特殊之处,但当然管理远程存储的复杂性会在其他级别发生。

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。