# 19.2.创建数据库集群

19.2.1. 二级文件系统的使用

19.2.2. 文件系统

在执行任何操作之前,必须初始化磁盘上的数据库存储区域。我们称之为数据库集群(SQL标准使用术语catalog cluster。)数据库集群是由正在运行的数据库服务器的单个实例管理的数据库集合。初始化后,数据库集群将包含一个名为博士后,这是一个默认数据库,供实用程序、用户和第三方应用程序使用。数据库服务器本身不需要博士后数据库可能存在,但许多外部实用程序假定它存在。初始化期间在每个集群内创建的另一个数据库称为模板1。顾名思义,这将被用作后续创建数据库的模板;它不应该用于实际工作。(见第23章有关在群集中创建新数据库的信息。)

在文件系统中,数据库集群是一个目录,所有数据都将存储在该目录下。我们称之为数据目录数据区.存储数据的位置完全取决于您。没有默认设置,尽管位置如/usr/local/pgsql/data/var/lib/pgsql/data它们很受欢迎。数据目录在使用前必须使用该程序进行初始化initdb它与PostgreSQL一起安装。

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

要手动初始化数据库群集,请运行initdb并使用-D选项,例如:

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

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

# 提示

作为-D选项,可以设置环境变量PGDATA.

或者,你可以跑步initdb通过pg_ctl程序就像这样:

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

如果您使用pg_ctl用于启动和停止服务器(请参阅第19.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为数据库超级用户分配密码的选项。此外,请指定-md5-密码所以默认相信未使用身份验证模式;或者修改生成的pg_hba。形态运行后的文件initdb但是之前第一次启动服务器。(其他合理的方法包括使用同龄人用于限制连接的身份验证或文件系统权限。看见第21章更多信息。)

initdb还初始化默认区域设置对于数据库集群。通常情况下,它只会获取环境中的语言环境设置,并将它们应用于初始化的数据库。可以为数据库指定不同的语言环境;有关这方面的更多信息,请参阅第24.1节。特定数据库群集中使用的默认排序顺序由initdb,虽然可以使用不同的排序顺序创建新数据库,但如果不删除并重新创建它们,则无法更改initdb创建的模板数据库中使用的顺序。使用非本地语言环境也会影响性能CPOSIX.因此,第一次做出正确的选择很重要。

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

非-C而非-POSIX语言环境依赖于操作系统的排序规则库来进行字符集排序。这将控制存储在索引中的键的顺序。因此,群集无法通过快照还原、二进制流复制、其他操作系统或操作系统升级切换到不兼容的排序规则库版本。

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

许多安装都在文件系统(卷)上创建数据库群集,而不是在机器的“根”卷上。如果选择这样做,则不建议尝试使用辅助卷的最顶层目录(装入点)作为数据目录。最佳做法是在PostgreSQL用户拥有的装入点目录中创建一个目录,然后在该目录中创建数据目录。这避免了权限问题,尤其是对于pg之类的操作_升级,并且如果辅助卷脱机,还可以确保清除故障。

# 19.2.2.文件系统

一般来说,任何具有POSIX语义的文件系统都可以用于PostgreSQL。用户出于各种原因喜欢不同的文件系统,包括供应商支持、性能和熟悉程度。经验表明,在所有其他条件相同的情况下,人们不应该仅仅通过切换文件系统或进行较小的文件系统配置更改来期望重大的性能或行为更改。

# 19.2.2.1.NFS

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

将NFS与PostgreSQL结合使用的唯一明确要求是使用坚固的选项和坚固的选项,如果存在网络问题,进程可能会无限期“挂起”,因此此配置将需要仔细的监视设置。这个软的选项将在网络出现问题时中断系统调用,但PostgreSQL不会重复以这种方式中断的系统调用,因此任何此类中断都将导致报告I/O错误。

没有必要使用同步安装选项。政府的行为异步的选项足够了,因为PostgreSQL存在问题同步在适当的时间调用以刷新写缓存。(这类似于它在本地文件系统上的工作方式。)但是,强烈建议使用同步NFS上的导出选项服务器在它存在的系统上(主要是Linux)。否则同步NFS客户机上的或同等版本实际上不能保证访问服务器上的永久存储,这可能会导致类似于使用参数运行的损坏同步关这些装载和导出选项的默认值因供应商和版本而异,因此建议在任何情况下检查并明确指定它们,以避免任何歧义。

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