17.2. 创建一个数据库集簇

在你能做任何事情之前,你必须在磁盘上初始化一个数据库存储区域。我们称之为一个数据库集簇SQL使用的术语是目录集簇)。一个数据库集簇是被一个运行数据库服务器的单一实例所管理的一个数据库的集合。在初始化之后,一个数据库集簇将包含一个名为postgres的数据库,它表示被功能、用户和第三方应用所使用的默认数据库。数据库服务器本身并不要求postgres数据库存在。另一个在初始化过程中为每一个集簇创建的数据库被称为template1。顾名思义,它将被用于创建后续数据库的模板;它不应该被用于实际工作(在集簇内创建新数据库的更多信息请见Chapter 21)。

在文件系统术语中,一个数据库集簇将是一个单一目录,所有数据都将被存储在其中。我们称它为数据目录数据区域。在哪里存储你的数据完全由你选择。没有默认的位置,不过/usr/local/pgsql/data/var/lib/pgsql/data位置比较流行。要初始化一个数据库集簇,使用和PostgreSQL一起安装的命令initdb。你的数据库集簇的文件系统位置由-D选项指定,例如:

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

注意你必须在使用PostgreSQL用户账户(如前一节所示)登录后执行这个命令。

Tip: 作为-D选项的一种替换方案,你可以设置环境变量PGDATA

另一种替代方案是,你可以通过pg_ctl程序来运行initdb

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

如果你使用pg_ctl来启停服务器(见Section 17.3),这种方法可能更直观,以为这样pg_ctl将是你用来管理数据库服务器实例的唯一命令。

如果你指定的目录还不存在,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文件(另外一些可行的方法包括peer认证或者用文件系统权限限制连接。更多信息见Chapter 19)。

initdb同时也为数据库集簇初始化默认区域。 通常,它将只是使用环境中的区域设置并且把它们应用于被初始化的数据库。 可以为数据库指定一个不同的区域;有关于此的更多信息可以在Section 22.1中找到。 特定数据库集簇中使用的默认排序顺序是通过initdb设置的, 虽然你可以创建使用不同排序顺序的新数据库,但在 initdb 创建的模板数据库中使用的顺序不能更改(除非删除并重建它们)。使用非CPOSIX的区域还会对性能造成影响。因此,第一次就正确地选择很重要。

initdb还为数据库集簇设置默认的字符集编码。通常字符集编码应该选择与区域设置匹配。详见Section 22.3

17.2.1. 网络文件系统

许多安装会在网络文件系统上创建数据库集簇。有时直接通过NFS, 或通过内部使用NFS的网络附加存储设备(NAS)完成。 PostgreSQL不对 NFS文件系统做特殊处理,即它假定NFS的行为和本地连接的设备完全一样(DFS,直接附加存储)。如果客户端和服务器NFS实现有非标准的语义,这将导致可靠性问题 (参阅http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html)。 具体来说,延迟(异步)写入到NFS服务器可以导致可靠性问题。 如果可能的话,把NFS文件系统挂载为同步(无高速缓存)可以避免这一点。还有,我们不推荐软挂载的NFS(存储区域网络(SAN)使用低级别的通讯协议而不是NFS)。