3.2. 创建数据库集群

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

用文件系统的术语来说,一个数据库集群将是一个目录,所有数据都 将存放在这个目录中.我们把它称做 数据目录数据区 .在哪里存放数据完全是你的选择,我们没有缺省值,尽管 /usr/local/pgsql/data/var/lib/pgsql/data 这样的目录很常用. 要初始化一个数据库集群,可以使用命令 initdb, 这个命令于 PostgreSQL一起安装.你可以用-D 标识你为你的数据库系统选择的文件系统位置,例如

> initdb -D /usr/local/pgsql/data
请注意你必须以 Postgres 用户的身份来执行这条命令, 这一点我们在前面一节描述过.

技巧: 作为 -D选项的替代品,你还可以使用环境变量 PGDATA

如果你声明的路径还不存在, initdb 将试图创建它. 你很有可能缺少做这些事情的权限(如果你按照我们的建议 创建了一个非特权帐户的话).这时,你可以自己创建该目录(以root身份) 然后把该目录的所有权交给 Postgres 用户或者赋与她写权限. 下面是可能有效的方法:

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 禁止除 Postgres 用户帐户以外的任何用户访问 这个目录.

运行 initdb 的时候你可能碰到的一件奇怪的事情是 看到下面这样的注意信息:

NOTICE:  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. 在大多数系统上,区域设置是通过改变环境变量 LC_ALLLANG 的值来实现的. 在特定数据库集群里的排序顺序是由 initdb 设置的, 而且以后就不能更改了,除非倾倒所有数据,重新 initdb, 重新装载数据.因此在这个阶段做决定很有必要.