pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
在做任何事情之前,必须先在磁盘上初始化一个数据库存储区域。我们把它称为数据库集簇。(SQL 标准使用术语目录集簇(catalog cluster)。)数据库集簇是由一个正在运行的数据库服务器实例管理的一组数据库。初始化之后,数据库集簇中会包含一个名为postgres的数据库,作为供工具、用户和第三方应用使用的默认数据库。数据库服务器本身并不要求该postgres数据库存在,但许多外部工具程序都假定它存在。初始化期间,集簇中还会创建另一个数据库,名为template1。顾名思义,它会作为后续新建数据库的模板;不应将它用于实际工作。(关于在集簇中创建新数据库的信息,见第 20 章。)
从文件系统角度看,数据库集簇就是一个目录,所有数据都存储在其下。我们将它称为数据目录或数据区域。数据存放位置完全由你决定,没有默认值;常用位置包括 /usr/local/pgsql/data或/var/lib/pgsql/data。要初始化数据库集簇,请使用命令 initdb,该命令随以下产品安装:PostgreSQL。数据库集簇在文件系统中的目标位置通过 -D 选项指定,例如:
$initdb -D /usr/local/pgsql/data
注意,必须先登录 PostgreSQL 用户账户,再执行此命令。该账户已在上一节介绍。
如果指定的目录尚不存在,initdb 会尝试创建它。但(如果你听从了我们的建议、创建了非特权账户)它很可能没有这样的权限。这种情况下,你应该自己(以 root 身份)创建该目录,并把所有者改为 PostgreSQL 用户。具体做法可能如下:
root#mkdir /usr/local/pgsql/dataroot#chown postgres /usr/local/pgsql/dataroot#su postgrespostgres$initdb -D /usr/local/pgsql/data
如果数据目录看起来已经被初始化过,initdb 会拒绝运行。
由于数据目录包含存储在数据库中的全部数据,必须保护它免遭未经授权的访问。因此,initdb 会撤销除 PostgreSQL 用户以外所有人的访问权限。
不过,尽管目录内容是安全的,默认的客户端认证设置却允许任何本地用户连接到数据库,甚至成为数据库超级用户。如果你不信任其他本地用户,我们建议在运行initdb时使用-W、--pwprompt或--pwfile之一,为数据库超级用户指定密码。另外,指定-A md5或-A password,以避免使用默认的trust认证方式;或者在运行initdb之后、首次启动服务器之前修改生成的pg_hba.conf文件。(其他合理方法包括使用ident认证,或使用文件系统权限限制连接。更多信息见第 21 章。)
initdb 还会初始化数据库集簇的默认区域设置。通常,它会直接采用环境中的区域设置,并将其应用于初始化的数据库。可以为数据库指定不同的区域设置;更多信息见 第 22.1 节。特定数据库集簇中使用的排序顺序由initdb设置,除非把所有数据转储出来、重新运行initdb、再重新装载数据,否则此后无法更改。使用 C 或 POSIX 以外的区域设置还会影响性能。因此,一开始就作出正确选择很重要。
initdb还会为数据库集簇设置默认字符集编码。通常应选择与区域设置相匹配的字符集编码。详见第 22.2 节。
许多安装会在网络文件系统上创建数据库集簇。有时通过 NFS 完成,有时则使用内部采用 NFS 的网络附加存储(NAS)设备。PostgreSQL 不会对 NFS 文件系统做特殊处理,也就是说,它假定 NFS 的行为与本地连接的驱动器(DAS,直接附加存储)完全一致。如果客户端或服务器端的 NFS 实现不提供标准文件系统语义,就可能导致可靠性问题(参见 http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html)。具体而言,对 NFS 服务器的延迟(异步)写入可能导致数据损坏。如果可能,应以同步方式(不使用缓存)挂载 NFS 文件系统,以避免这一风险。(存储区域网络(SAN)使用低层通信协议而非 NFS。)
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。