16.2. 创建数据库集群

在你做任何事情之前,你必须初始化磁盘上的数据库的存储区间。 我们管它叫数据库集群。(SQL 使用术语目录集群。) 一个数据库集群是一系列数据库的集合,这些数据库可以通过单个数据库服务器的实例管理。 在初始化后,一个数据库集群将包含一个叫 postgres 的数据库, 这个库是给工具,用户和第三方应用使用的缺省数据库。数据库服务器本身并不要求 postgres 数据库的存在,但是很多外部工具应用假设它存在。 另外一个在初始化过程中在每个集群中创建的数据库叫 template1。 正如其名一样,这个数据库将作为随后创建的数据库的模版;在实际工作中不应该使用这个库。 (参阅 Chapter 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,让它使用 md5 或者 password,而不是 trust 认证方式。 (另外一些合理的方法包括 ident 认证或者用文件系统权限限止联接。 参阅 Chapter 20 获取更多细节。)

initdb 同时也为数据库集群初始化缺省区域。 通常,它将只是使用环境中的区域设置并且把它们应用与初始化的数据库。 我们可以为数据库声明不同的区域;有关这些的更多信息可以在 Section 21.1 中找到。 在特定数据库集群里的排序顺序是由 initdb 设置的, 而且以后就不能更改了,除非转储所有数据,重新运行initdb, 并重新装载数据。使用非 C 或者 POSIX 的区域还会有性能影响。 因此,第一次就选择正确很重要。

initdb 还为数据库集群设置缺省的字符集编码。 通常这个应该选择与区域匹配。详见 Section 21.2