initdb 创建一个新的 PostgreSQL 数据库集群。一个数据库集群是由单个服务器实例管理的多个数据库的集合。
创建数据库系统包括创建数据库数据的宿主目录,生成共享的系统表(不属于任何特定数据库的表)和创建 template1 和 postgres 数据库。当你以后再创建一个新数据库时,template1 数据库里所有内容都会拷贝过来。因此,任何在 template1 里面安装的东西都自动拷贝到之后创建的数据库中。postgres 数据库是一个缺省数据库,用于给用户、工具、第三方应用提供缺省数据库。
尽管 initdb 会尝试创建相应的数据目录,但经常会没有权限做这件事。因为所要创建目录的父目录通常被 root 所拥有。要初始化这种设置,用 root 创建一个空数据目录,然后用 chown 把该目录的所有权交给数据库用户帐号,然后 su 成数据库用户,最后以数据库用户身份运行 initdb 。
initdb 必须以运行数据库服务器的用户身份运行,因为服务器需要访问 initdb 创建的目录和文件。因为服务器通常是以非 root 身份运行的,因此一般也就不以 root 用户运行 initdb ,事实上 initdb 将拒绝你以 root 用户运行它。
initdb 初始化该数据库集群的缺省区域和字符集编码。字符编码排序(LC_COLLATE)和字符集类(LC_CTYPE 也就是大写、小写、数字等)是对所有数据库估定的,不能改变。使用 C 或 POSIX 之外的字符编码排序还会有性能影响。因此在运行 initdb 的时候就做出正确的选择是非常重要的。其它区域范畴可以在随后启动服务器的时候改变。所有服务器区域值(lc_*)都可以用 SHOW ALL 显示。更多细节可以在节21.1找到。
字符集编码可以在数据库创建的时候独立设置。initdb 决定 template1 数据库的编码,而该编码将成为所有其它数据库的缺省。要修改缺省编码,可以使用 --encoding 选项。更多细节可以在节21.2找到。
这个选项声明本地用户在 pg_hba.conf 里面使用的认证方法。除非你相信所有本地用户,否则不要使用 trust(缺省)。
这个选项声明数据库集群应该存放在哪个目录。这是 initdb 需要的唯一信息,但是你可以通过设置 PGDATA 环境变量来避免键入,这样做可能方便一些,因为稍后数据库服务器(postgres)可以通过同一个变量找到数据库目录。
选择模板数据库的编码方式。这将是你以后创建的数据库的缺省编码方式,除非你创建数据库时覆盖了它。缺省是从区域设置中获得的,如果没有区域设置,就是 SQL_ASCII 。PostgreSQL 服务器支持的字符集在节21.2.1里描述。
为数据库集群设置缺省的区域。如果没有声明这个选项,那么区域是从 initdb 运行的环境中继承过来的。区域设置在节21.1里描述。
类似 --locale ,但是只设置特殊范畴的区域。
选择数据库超级用户的用户名。缺省是运行 initdb 的用户的有效用户。超级用户的名字是什么并不重要,但是可以选择习惯的名字 postgres ,即使操作系统的用户名字不一样也没关系。
令 initdb 提示输入数据库超级用户的口令。如果你不准备使用口令认证,这个东西并不重要。否则你将不能使用口令认证,直到你设置了口令。
令 initdb 从一个文件里读取数据库超级用户的口令。该文件的第一行将被当作口令使用。
其它不常用的参数还有:
从初始化后端打印调试输出以及一些其它的一些普通用户不太感兴趣的信息。初始化后端是 initdb 用于创建系统表的程序。这个选项生成大量非常枯燥的输出。
告诉 initdb 到哪里找初始化数据库所需要的输入文件。通常是不必要的。如果需要你明确声明的话,程序会提示你输入。
缺省时,当 initdb 发现一些错误妨碍它完成创建数据库集群的工作时,它将在检测到不能结束工作之前将其创建的所有文件删除。这个选项禁止任何清理动作,因而对调试很有用。