3.2. 创建数据库集群

在你做任何事情之前,你必须初始化磁盘上的数据库的存储区间. 我们管它叫数据库集群. (SQL 使用术语目录集群.) 一个数据库集群是一系列数据库的集合,这些数据库可以通过 单个数据库服务器的实例访问.在初始化后,一个数据库集群 将包含一个叫template1的数据库. 正如其名一样,这个数据库将作为随后创建的数据库的 模版;在实际工作中不应该使用这个库. (参阅 Chapter 7 获取有关创建数据库的信息。)

用文件系统的术语来说,一个数据库集群将是一个目录,所有数据都 将存放在这个目录中.我们把它称做 数据目录数据区 .在哪里存放数据完全是你的选择,我们没有缺省值,尽管 /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 给 超级用户赋予一个口令.在 initdb 之后, 在你第一次启动服务器之前 修改 pg_hba.conf,让它使用 md5 或者 password,而不是 trust 认证方式. (另外一些方法包括 ident 认证或者 用文件系统权限限止联接.参阅 Chapter 4 获取更多细节.)

initdb 同时也为数据库集群初始化区域. 通常,它将只是使用环境中的区域设置并且把它们应用与初始化的数据库. 我们可以为数据库声明不同的区域;有关这些的更多信息可以在 Section 5.1 中找到. 运行 initdb 的时候你可能碰到的一件奇怪的事情是 看到下面这样的注意信息:

WARNING:  Initializing database with en_US collation order.
        This locale setting will prevent use of index optimization for
        LIKE and regexp searches.  If you are concerned about speed of
        such queries, you may wish to set LC_COLLATE to "C" and
        re-initdb.  For more information see the Administrator's Guide.

这条注意信息主要是警告你目前所用的区域设置将把索引按照 一种无法用于LIKE和正则表达式搜索的方式存储. 如果你执行这样的搜索时需要高性能的话,你应该把当前区域设置设 为 "C" 然后重新运行 initdb. 也就是说,运行 initdb --lc-collate=C. 在特定数据库集群里的排序顺序是由 initdb 设置的, 而且以后就不能更改了,除非转储所有数据,重新运行initdb, 并重新装载数据.因此在这个阶段做决定很有必要.