On this page
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 用户帐户时必须执行此命令,如上一节所述。
另外,您可以通过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 必须先删除和重新创建,才能更改。使用C
或POSIX
以外的语言环境也会对性能产生影响。因此,第一次正确选择此选项很重要。
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 不能比其使用的文件系统更可靠。