18.2. 创建数据库集群

在执行任何操作之前,必须初始化磁盘上的数据库存储区域。我们称其为数据库集群。 (SQL 标准使用术语目录集群.)数据库集群是由运行中的数据库服务器的单个实例 Management 的数据库的集合。初始化后,数据库集群将包含一个名为postgres的数据库,这是公用程序,用户和第三方应用程序使用的默认数据库。数据库服务器本身不需要postgres数据库存在,但是许多外部 Util 都假定它存在。在初始化期间在每个群集内创建的另一个数据库称为template1。顾名思义,它将用作后续创建的数据库的模板;它不应该用于实际工作。 (有关在群集中创建新数据库的信息,请参阅Chapter 22。)

用文件系统的术语来说,数据库集群是一个目录,所有数据都将存储在该目录下。我们称其为数据目录数据区域。选择存储数据的位置完全取决于您。没有默认值,尽管/usr/local/pgsql/data/var/lib/pgsql/data等位置很受欢迎。要初始化数据库集群,请使用与 PostgreSQL 一起安装的命令initdb-D选项指示数据库集群所需的文件系统位置,例如:

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

请注意,登录到 PostgreSQL 用户帐户时必须执行此命令,如上一节所述。

Tip

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

另外,您可以通过pg_ctl程序运行initdb,如下所示:

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

如果您使用pg_ctl来启动和停止服务器(请参见Section 18.3),则这可能会更直观,因此pg_ctl将是用于 Management 数据库服务器实例的唯一命令。

initdb将尝试创建您指定的目录(如果尚不存在)。当然,如果initdb没有在父目录中写入的权限,这将失败。通常建议 PostgreSQL 用户不仅拥有数据目录,而且拥有其父目录,因此这不应该成为问题。如果所需的父目录也不存在,那么如果祖 parent 目录不可写,则需要使用 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 用户以外的所有人的访问权限。

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

initdb还会初始化数据库集群的默认语言环境。通常,它将仅使用环境中的语言环境设置并将其应用于初始化的数据库。可以为数据库指定不同的语言环境。有关更多信息,请参见Section 23.1。特定数据库集群中使用的默认排序 Sequences 由initdb设置,尽管您可以使用不同的排序 Sequences 来创建新的数据库,但是 initdb 创建的模板数据库中使用的 Sequences 必须先删除和重新创建,才能更改。使用CPOSIX以外的语言环境也会对性能产生影响。因此,第一次正确选择此选项很重要。

initdb还设置数据库集群的默认字符集编码。通常,应选择与语言环境设置匹配的语言。有关详细信息,请参见Section 23.3

C和非POSIX语言环境依赖于 os 的归类库进行字符集排序。这控制了存储在索引中的键的 Sequences。因此,群集无法通过快照还原,二进制流复制,其他 os 或 os 升级切换到不兼容的归类库版本。

18 .2.1. 辅助文件系统的使用

除了计算机的“根”卷以外,许多安装都在文件系统(卷)上创建数据库集群。如果选择这样做,则不建议尝试使用辅助卷的最顶层目录(装入点)作为数据目录。最佳实践是在 PostgreSQL 用户拥有的安装点目录中创建一个目录,然后在其中创建数据目录。这样可以避免权限问题,尤其是对于诸如 pg_upgrade 之类的操作,还可以确保在辅助卷脱机时清除失败。

18 .2.2. 网络文件系统的使用

许多安装在网络文件系统上创建其数据库群集。有时,这是通过 NFS 或通过内部使用 NFS 的网络连接存储(NAS)设备完成的。 PostgreSQL 对 NFS 文件系统没有任何特殊要求,这意味着它假定 NFS 的行为与本地连接的驱动器完全相同。如果 Client 端或服务器 NFS 实现不提供标准的文件系统语义,则可能导致可靠性问题(请参阅http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html)。具体来说,延迟(异步)写入 NFS 服务器可能会导致数据损坏问题。如果可能,请同步安装 NFS 文件系统(不进行缓存),以避免这种危险。另外,不建议软安装 NFS 文件系统。

存储区域网络(SAN)通常使用 NFS 以外的通信协议,并且可能会或可能不会遭受此类危险。建议您查阅有关数据一致性保证的供应商文档。 PostgreSQL 不能比其使用的文件系统更可靠。