↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 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
历史版本PostgreSQL 8.1 已于 2010 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

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

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

从文件系统角度看,数据库集簇就是一个目录,所有数据都存储在其下。我们将它称为数据目录或数据区域。数据存放位置完全由你决定,没有默认值;常用位置包括 /usr/local/pgsql/data或/var/lib/pgsql/data。要初始化数据库集簇,请使用命令 initdb,该命令随以下产品安装:PostgreSQL。数据库集簇在文件系统中的目标位置通过 -D 选项指定,例如:

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

注意,必须先登录 PostgreSQL 用户账户,再执行此命令。该账户已在上一节介绍。

提示

除了使用 -D 选项,也可以设置环境变量 PGDATA。

如果指定的目录尚不存在,initdb 会尝试创建它。但(如果你听从了我们的建议、创建了非特权账户)它很可能没有这样的权限。这种情况下,你应该自己(以 root 身份)创建该目录,并把所有者改为 PostgreSQL 用户。具体做法可能如下:

root# mkdir /usr/local/pgsql/data
root# chown postgres /usr/local/pgsql/data
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文件。(其他合理方法包括使用ident认证,或使用文件系统权限限制连接。更多信息见第 20 章。)

initdb 还会初始化数据库集簇的默认区域设置。通常,它会直接采用环境中的区域设置,并将其应用于初始化的数据库。可以为数据库指定不同的区域设置;更多信息见 第 21.1 节。特定数据库集簇中使用的排序顺序由initdb设置,除非把所有数据转储出来、重新运行initdb、再重新装载数据,否则此后无法更改。使用 C 或 POSIX 以外的区域设置还会影响性能。因此,一开始就作出正确选择很重要。

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。