17.2. 创建数据库集群

在做任何事情之前,必须先初始化磁盘上的数据存储区, 叫作数据库集群(标准SQL术语称为"目录集群")。 一个数据库集群是一系列数据库的集合,这些数据库可以通过单个数据库服务器的实例管理。 在初始化后,一个数据库集群将包含一个叫postgres的数据库, 这个库是给工具、用户和第三方程序使用的缺省数据库。 数据库服务器本身并不要求postgres数据库的存在, 但是很多外部工具假设它存在。另外一个在每个集群初始化过程中创建的 数据库叫template1。正如其名一样, 这个数据库将作为随后创建的数据库的模版;在实际工作中不应该使用 这个库(参阅Chapter 21获取有关创建数据库的信息)。

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

$initdb-D/usr/local/pgsql/data

请注意,你必须以PostgreSQL用户的身份来执行这条命令, 这一点我们在前面一节描述过。

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

另外,你可以运行initdb通过pg_ctl程序 像这样:

$pg_ctl-D/usr/local/pgsql/datainitdb

如果你正在用pg_ctl来启停服务,这可能更直观。(见Section 17.3), 所以pg_ctl将您使用于管理数据库服务器实例的唯一的命令。

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

root#mkdir/usr/local/pgsql/data
root#chownpostgres/usr/local/pgsql/data
root#supostgres
postgres$initdb-D/usr/local/pgsql/data

如果数据目录看起来像已经初始化过了,那么initdb会拒绝运行。

因为数据目录包含所有存储在数据库里的数据,所以出于安全考虑, 这个目录不能给任何非授权用户访问。因此,initdb 禁止除PostgreSQL用户帐户以外的任何用户访问这个目录。

不过,因为目录的内容是安全的,所以缺省的客户端认证设置允许任意本 地用户连接到数据库甚至成为超级用户。如果你不信任本地用户, 我们建议你使用initdb-W,--pwprompt--pwfile选项给超级用户赋予一个口令。 还有,声明-Amd5-Apassword,这样就不会使用缺省的trust 身份认证。或者在执行initdb之后,第一次启动服务器之前 修改pg_hba.conf文件。另外一些合理的方法 包括 ident认证或者用文件系统权限禁止连接。 参阅Chapter 19获取更多细节。

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

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

17.2.1. 网络文件系统

许多安装在网络文件系统创建的数据库集群。有时这样做是直接通过NFS, 或网络附加存储设备(NAS) 其内部使用NFSPostgreSQL不做什么特别的NFS文件系统, 这意味着它将假定NFS行为与像连接本地设备(DAS,直接附加存储)。如果 客户端和服务器NFS实现非标准的语义,这将导致可靠性问题 (参阅http://www.time-travellers.org/shane/papers/NFS_cons idered_harmful.html)。 具体来说,延迟(异步)写入的NFS服务器可以导致可靠性问题。 如果可能的话,安装NFS文件系统同步(无缓存),以避免这一点。建议不软安装NFS。 (存储区域网络(SAN)使用低级别的通讯协议而不是NFS。)