多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 17.2\. 创建数据库集群 在做任何事情之前,必须先初始化磁盘上的数据存储区,叫作_数据库集群_ (标准SQL术语称为"目录集群")。一个数据库集群是一系列数据库的集合, 这些数据库可以通过单个数据库服务器的实例管理。在初始化后,一个数据库集群将包含一个叫`postgres` 的数据库,这个库是给工具、用户和第三方程序使用的缺省数据库。数据库服务器本身并不要求`postgres` 数据库的存在,但是很多外部工具假设它存在。另外一个在每个集群初始化过程中创建的数据库叫`template1`。 正如其名一样,这个数据库将作为随后创建的数据库的模版;在实际工作中不应该使用这个库 (参阅[Chapter 21](#calibre_link-672)获取有关创建数据库的信息)。 用文件系统的术语来说,一个数据库集群是一个目录,所有数据都将存放在这个目录中。 我们把它称做_数据目录_或_数据区_。 在哪里存放数据完全取决于你的选择,我们没有缺省值,尽管`/usr/local/pgsql/data` 或`/var/lib/pgsql/data`这样的目录很常用。要初始化一个数据库集群, 可以使用[initdb](#calibre_link-542),命令, 这个命令与PostgreSQL一起安装。你可以用`-D` 选项指定数据目录的位置,例如: ``` <samp class="literal">$</samp> <kbd class="literal">initdb -D /usr/local/pgsql/data</kbd> ``` 你必须以PostgreSQL用户的身份来执行这条命令, 这一点我们在前面一节描述过。 > **Tip:** 作为`-D`选项的替代品,你还可以使用`PGDATA`环境变量。 可选的,你可以通过[pg_ctl](#calibre_link-544)程序运行 `initdb`,像这样: ``` <samp class="literal">$</samp> <kbd class="literal">pg_ctl -D /usr/local/pgsql/data initdb</kbd> ``` 如果你使用`pg_ctl`启动或停止服务器(参阅[Section 17.3](#calibre_link-1097))可能会更直观, 所以`pg_ctl`将会是你管理数据库服务器实例唯一使用的命令。 如果你声明的路径还不存在,`initdb`将试图创建它。如果你按照我们的建议创建了一个非特权帐户的话, 你很有可能缺少做这些事情的权限。这时,你可以自己创建该目录(以 root 身份)然后把该目录的所有权交给 PostgreSQL用户。下面是可能有效的方法: ``` root# <kbd class="literal">mkdir /usr/local/pgsql/data</kbd> root# <kbd class="literal">chown postgres /usr/local/pgsql/data</kbd> root# <kbd class="literal">su postgres</kbd> postgres$ <kbd class="literal">initdb -D /usr/local/pgsql/data</kbd> ``` 如果数据目录看起来像已经初始化过了,那么`initdb`会拒绝运行。 因为数据目录包含所有存储在数据库里的数据,所以出于安全考虑,这个目录不能给任何非授权用户访问。 因此,`initdb`禁止除PostgreSQL用户帐户以外的任何用户访问这个目录。 不过,因为目录的内容是安全的,所以缺省的客户端认证设置允许任意本地用户连接到数据库甚至成为超级用户。 如果你不信任本地用户,我们建议你使用`initdb`的`-W`, `--pwprompt`或 `--pwfile` 选项给超级用户赋予一个口令。还有,声明`-A md5`或`-A password`,这样就不会使用缺省的`trust` 身份认证。或者在执行`initdb`之后,第一次启动服务器_之前_ 修改`pg_hba.conf`文件。另外一些合理的方法包括`peer` 认证或者用文件系统权限禁止连接。参阅[Chapter 19](#calibre_link-14)获取更多细节。 `initdb`同时也为数据库集群初始化缺省区域。通常, 它将只是使用环境中的区域设置并且把它们应用于初始化的数据库。我们可以为数据库声明不同的区域; 有关这些的更多信息可以在[Section 22.1](#calibre_link-1271)中找到。在特定数据库集群里的缺省排序顺序是由 `initdb`设置的,而且当你能用不同的排序顺序创建新的数据库时, initdb创建的模板数据库中使用的排序不能改变,除非删除并重新创建它们。使用非`C`或`POSIX` 的区域还会有性能影响。因此,第一次就选择正确很重要。 `initdb`还为数据库集群设置缺省的字符集编码。通常这个应该选择与区域匹配。 详见[Section 22.3](#calibre_link-1272)。 ## 17.2.1\. 网络文件系统 许多安装在网络文件系统创建数据库集群。有时直接通过NFS或通过使用网络附加存储(NAS) 设计内部使用NFS。PostgreSQL并不为NFS文件系统做什么特别的, 意味着他假设NFS和本地连接驱动器(DAS,直接附加存储)的行为一样。如果客户端和服务器NFS 实现有非标准的语义,会引起可靠性问题(参阅[http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html](http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html))。 特别的,延迟的(异步的)写入NFS服务器可能会引起可靠性问题;如果可能, 同步的(没有缓存)安装NFS文件系统以避免这个问题。同样,不建议软安装NFS。 (存储区域网络(SAN)使用一个低级的通信协议而不是NFS。)