选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

18.2. 创建一个数据库集簇 #

在做任何事情之前,必须先在磁盘上初始化一个数据库存储区域。我们把它称为数据库集簇。(SQL 标准使用术语 catalog cluster。)数据库集簇是由一个正在运行的数据库服务器实例管理的一组数据库。初始化之后,数据库集簇中会包含一个名为postgres的数据库,作为供工具、用户和第三方应用使用的默认数据库。数据库服务器本身并不要求该postgres数据库存在,但许多外部工具程序都假定它存在。初始化期间,集簇中还会创建另一个数据库,名为template1。顾名思义,它会作为后续新建数据库的模板;不应将它用于实际工作。(关于在集簇中创建新数据库的信息,见Chapter 22。)

从文件系统角度看,数据库集簇就是一个目录,所有数据都存储在其下。我们将它称为数据目录数据区域。数据存放位置完全由你决定,没有默认值;常用位置包括 /usr/local/pgsql/data/var/lib/pgsql/data。要初始化数据库集簇,请使用命令 initdb该命令随以下产品安装:PostgreSQL。数据库集簇在文件系统中的目标位置通过 -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就会成为你管理数据库服务器实例时使用的唯一命令。

如果指定的目录尚不存在,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 用户以外所有人的访问权限。

不过,尽管目录内容是安全的,默认的客户端认证设置却允许任何本地用户连接到数据库,甚至成为数据库超级用户。如果你不信任其他本地用户,我们建议在运行 initdb 时使用 -W--pwprompt--pwfile 之一,为数据库超级用户指定密码。 另外,指定 -A md5-A password,以避免使用默认的 trust 认证方式;或者在运行 initdb 之后、首次启动服务器之前修改生成的 pg_hba.conf 文件。(其他合理方法包括使用 peer 认证,或使用文件系统权限限制连接。更多信息见 Chapter 20。)

initdb 还会初始化数据库集簇的默认区域设置。通常,它会直接采用环境中的区域设置,并将其应用于初始化的数据库。可以为数据库指定不同的区域设置;更多信息见 Section 23.1。特定数据库集簇中使用的默认排序顺序由 initdb 设置,虽然你可以使用不同的排序顺序创建新数据库,但 initdb 创建的模板数据库所使用的顺序,只有删除并重建这些数据库才能更改。使用 CPOSIX 以外的区域设置还会影响性能。因此,一开始就作出正确选择很重要。

initdb还会为数据库集簇设置默认字符集编码。通常应选择与区域设置相匹配的字符集编码。详见Section 23.3

C和非POSIX的区域设置依赖操作系统的排序规则库来决定字符集排序。这会控制索引中存储键值的顺序。因此,无论是通过快照恢复、二进制流复制、切换到不同操作系统,还是升级操作系统,都不能让一个集簇切换到不兼容版本的排序规则库。

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

很多安装会把数据库集簇建在机器卷以外的文件系统(卷)上。如果这样做,不建议把二级卷的最顶层目录(挂载点)直接用作数据目录。最佳实践是在挂载点目录下创建一个由PostgreSQL用户拥有的目录,再在其下创建数据目录。这样可以避免权限问题,尤其是在执行pg_upgrade之类的操作时;同时也能确保二级卷脱机时以干净的方式失败。

18.2.2. 使用网络文件系统 #

许多安装会在网络文件系统上创建数据库集簇。有时通过 NFS 完成,有时则使用内部采用 NFS 的网络附加存储(NAS)设备。PostgreSQL 不会对 NFS 文件系统做特殊处理,也就是说,它假定 NFS 的行为与本地连接的驱动器完全一致。如果客户端或服务器端的 NFS 实现不提供标准文件系统语义,就可能导致可靠性问题(参见 http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html)。具体而言,对 NFS 服务器的延迟(异步)写入可能导致数据损坏。如果可能,应以同步方式(不使用缓存)挂载 NFS 文件系统,以避免这一风险。此外,不建议对 NFS 文件系统使用软挂载。

存储区域网络(SAN)通常使用 NFS 以外的通信协议,可能存在也可能不存在此类风险。建议查阅供应商文档中有关数据一致性保证的说明。PostgreSQL 的可靠性不可能高于它所使用的文件系统。