17.2. 建立一个数据库集群(Database Cluster)html
在你能作任何事情以前,你必须在磁盘上初始化一块存储空间。咱们称这为一个数据库集群(database cluster). 一个Database cluster是一批被一个运行着数据库服务的示例所管理的数据库.初始化之后,一个database cluster将会包含一个名为 postgres的数据库,它是一个被一些工具、用户和第三方应用使用的默认数据库。数据库服务器自己不须要 postgres ,可是不少外部的程序会假设它存在。另一个在每个cluster初始化时建立的数据库叫作 template1. 就像它的名字所暗示,它会被用来做为一个建立后续数据库所使用的模板;它不该该被实际工做所使用(参考21章获取关于在一个集群中建立新的数据库的信息)sql
在文件系统术语中,一个database cluster是单个的目录,全部的数据会被存储在这个目录下。咱们称这个目录为数据目录(data directory)或数据区域(data area).选择在哪一个目录下存储您的数据彻底取决于您,没有默认目录,尽管诸如/usr/local/pgsql/data或/var/lib/pgsql/data之类的目录做为数据目录是比较流行的。初始化一个database cluster,使用initdb命令,它是和PostgreSQL一块儿安装的。您指望的的database cluster文件系统目录使用选项 -D标注,如例:数据库
$initdb -D /usr/local/pgsql/data缓存
注意在您登陆PostgreSQL用户帐户以前必须先执行这个命令,这在上一节已经描述过了。(提示:您能够设置环境变量PGDATA来替换-D选项)安全
可供选择的,您也能够经过pg_ctl程序像下面这样运行 initdb服务器
$pg_ctl -D /usr/local/pgsql/data initdb网络
若是您使用pg_ctl启动和中止服务器(查看17.3节)将会更加直观。这样的话在管理数据库服务器示例时pg_ctl将会是惟一的一个命令。app
initdb将会尝试建立你指定的一个不存在的目录。颇有可能您没有权限建立(若是您尊随咱们的建议并建立了一个非特权帐户)。在这种状况下,您应该建立这个目录(好比用root权限),而后改变这个目录的拥有者(owner)为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将不会运行。ide
因为数据目录包含了全部存储在数据库里的数据,所以应该有对未受权的访问的安全机制。initdb收回了全部其余用户的访问权限,除了PostgreSQL用户.
然而,尽管这个目录下的内容是安全的,默认的客户受权设置容许任何本地用户链接数据库甚至成为数据库超级用户(管理员)。若是您不信任本地的其余用户,咱们建议您使用任意一种initdb的选项-W,--pwprompt或--pwfile来分配给数据库超级用户的密码。而且,指定-A md5或-A password,这样默认的 trust 受权模式不起做用;或者在运行initdb后,第一次启动您的数据库服务器以前修改生成的pg_hda.conf文件。(其余的合理的途径包括使用peer受权或文件系统权限来限制连接。查看19章获取更多信息)
initdb同时为database cluster初始化默认的locale,通常而言,它只是使用本地locale设置并将其应用到初始化的数据库中。为数据库指定一个其余的locale是可能的;更多的信息能够在22.1节找到。默认的应用在特定的database cluster上的排序(sort order)是被initdb设置的,而且若是您建立了使用不一样的排序的新的数据库,除非您删除重建它,在template数据库中使用的order是不会改变的。使用其余的locale而不是使用C或POSIX会对性能产生影响。所以在第一次正确的选择选项是很重要的。
initdb同时为database cluster设置默认的字符集和encoding。通常而言应该选择匹配locale设置。更多细节查看22.3节
17.2.1 网络文件系统
不少安装在网络文件系统建立database cluster。有些直接用NFS,或者使用内部使用NFS的NAS来完成。PostgreSQL并不是特定于NFS文件系统,意味着它使用NFS的方式和本地链接的驱动(DAS,直接链接的存储器)彻底一致。若是客户端和服务端的NFS实现未遵循标准的语意(semantics),这可能会产生可靠性问题(查看http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html).具体而言,延时(异步)写入NFS服务器会产生可靠性问题;若是能够,尽可能同步挂载(不用缓存)