initdb — 创建一个新的 PostgreSQL 数据库集群
initdb [选项...] [ --pgdata | -D ] 目录
initdb 创建一个新的 PostgreSQL 数据库集群。
创建数据库集群包括创建集群数据所在的 目录,生成共享的目录表(属于整个集群而非任何特定数据库的表),以及创建 postgres、template1 和 template0 数据库。 postgres 数据库是一个默认数据库,供用户、实用程序和第三方应用程序使用。 template1 和 template0 用作可以通过后续 CREATE DATABASE 命令复制的源数据库。 template0 永远不应被修改,但您可以向 template1 添加对象,这些对象默认情况下将复制到以后创建的数据库中。有关更多详细信息,请参阅 第 22.3 节。
虽然 initdb 会尝试创建指定的数据目录,但如果所需数据目录的父目录归 root 所有,它可能没有权限。要在这种设置中进行初始化,请以 root 身份创建一个空数据目录,然后使用 chown 将该目录的所有权分配给数据库用户帐户,然后使用 su 切换到数据库用户以运行 initdb。
initdb 必须以将拥有服务器进程的用户身份运行,因为服务器需要访问 initdb 创建的文件和目录。由于服务器不能以 root 身份运行,因此您也不能以 root 身份运行 initdb。(实际上它会拒绝这样做。)
出于安全原因,默认情况下,由 initdb 创建的新集群只能由集群所有者访问。 --allow-group-access 选项允许与集群所有者同组的任何用户读取集群中的文件。这对于作为非特权用户执行备份很有用。
initdb 初始化数据库集群的默认区域设置和字符集编码。这些也可以在创建每个数据库时单独设置。 initdb 为模板数据库确定这些设置,这些设置将作为所有其他数据库的默认值。
默认情况下,initdb 使用 libc 区域设置提供程序(请参阅 第 23.1.4 节)。 libc 区域设置提供程序从环境中获取区域设置,并从区域设置中确定编码。
要为集群选择不同的区域设置,请使用 --locale 选项。还有单独的选项 --lc-* 和 --icu-locale(见下文)来设置各个区域设置类别的.*值。请注意,不同区域设置类别的不一致设置可能导致无意义的结果,因此应谨慎使用。
或者,initdb 可以通过指定 --locale-provider=icu 来使用 ICU 库提供区域设置服务。服务器必须使用 ICU 支持进行构建。要选择适用的特定 ICU 区域设置 ID,请使用 --icu-locale 选项。请注意,出于实现原因并支持旧代码,当使用 ICU 区域设置提供程序时,initdb 仍将选择并初始化 libc 区域设置。
当 initdb运行时,它会打印出它选择的区域设置。如果您有复杂的配置要求或指定了多个选项,建议检查结果是否符合预期。
有关区域设置的更多详细信息,请参阅 第 23.1 节。
要更改默认编码,请使用 --encoding。更多详细信息,请参阅 第 23.3 节。
-A authmethod--auth=authmethod #此选项指定 pg_hba.conf 中本地用户使用的默认身份验证方法(host 和 local 行)。有关有效值的概述,请参阅 第 20.1 节。
initdb 将使用指定的身份验证方法预填充 pg_hba.conf 条目,用于非复制和复制连接。
除非您信任系统上的所有本地用户,否则不要使用 trust。 trust 是默认设置,方便安装。
--auth-host=authmethod #此选项指定 pg_hba.conf(host 行)中通过 TCP/IP 连接进行的本地用户身份验证方法。
--auth-local=authmethod #此选项指定 pg_hba.conf(local 行)中通过 Unix 域套接字连接进行的本地用户身份验证方法。
-D directory--pgdata=directory #此选项指定数据库集群的存储目录。这是 initdb 所需的唯一信息,但您可以通过设置 PGDATA 环境变量来避免输入,这很方便,因为数据库服务器(postgres)稍后可以通过相同的变量找到数据目录。
-E encoding--encoding=encoding #选择模板数据库的编码。这也将是您以后创建的任何数据库的默认编码,除非您稍后覆盖它。 PostgreSQL 服务器支持的字符集在 第 23.3.1 节 中有描述。
默认情况下,模板数据库的编码源自区域设置。如果指定了 --no-locale(或者等效地,如果区域设置是 C 或 POSIX),则对于 ICU 提供程序,默认值为 UTF8;对于 libc 提供程序,默认值为 SQL_ASCII。
-g--allow-group-access #允许与集群所有者同组的用户读取 initdb 创建的所有集群文件。此选项在 Windows 上将被忽略,因为它不支持POSIX-风格的组权限。
--icu-locale=locale #当使用 ICU 提供程序时,指定 ICU 区域设置。区域设置支持在 第 23.1 节 中描述。
--icu-rules=rules #指定附加的排序规则以自定义默认排序规则的行为。这仅支持 ICU。
-k--data-checksums #对数据页使用校验和,以帮助检测 I/O 系统可能导致的静默损坏。此选项默认启用;使用 --no-data-checksums 禁用校验和。
启用校验和可能会带来轻微的性能损失。如果设置,将为所有数据库中的所有对象计算校验和。所有校验和失败都将在 pg_stat_database 视图中报告。有关详细信息,请参阅 第 28.2 节。
--locale=locale #设置数据库集群的默认区域设置。如果未指定此选项,则区域设置将从 initdb 运行的环境继承。区域设置支持在 第 23.1 节 中描述。
如果 --locale-provider 是 builtin,则必须指定 --locale 或 --builtin-locale 并设置为 C、C.UTF-8 或 PG_UNICODE_FAST。
--lc-collate=locale--lc-ctype=locale--lc-messages=locale--lc-monetary=locale--lc-numeric=locale--lc-time=locale #类似于 --locale,但仅设置指定类别的区域设置。
--no-locale #等同于 --locale=C。
--builtin-locale=locale #当使用内置提供程序时,指定区域设置名称。区域设置支持在 第 23.1 节 中描述。
--locale-provider={builtin|libc|icu} #此选项为新集群中创建的数据库设置区域设置提供程序。在以后创建新数据库时,可以在 CREATE DATABASE 命令中覆盖它。默认值为 libc(请参阅 第 23.1.4 节)。
--no-data-checksums #不启用数据校验和。
--pwfile=filename #使 initdb 从文件中读取引导超级用户的密码。文件的第一行将被用作密码。
-T config--text-search-config=config #设置默认的文本搜索配置。有关更多信息,请参阅 default_text_search_config。
-U username--username=username #设置 引导超级用户的用户名。默认情况下,这是运行 initdb 的操作系统用户的名称。
-W--pwprompt #使 initdb 提示输入引导超级用户的密码。如果您不打算使用密码身份验证,则此项不重要。否则,在设置密码之前,您将无法使用密码身份验证。
-X directory--waldir=directory #此选项指定写预日志(WAL)应存储的目录。
--wal-segsize=size #设置 WAL 段大小(以兆字节为单位)。这是 WAL 日志中每个单独文件的大小。默认大小为 16 兆字节。值必须是 1 到 1024(兆字节)之间的 2 的幂。此选项只能在初始化期间设置,之后不能更改。
调整此大小以控制 WAL 日志分发或归档的粒度可能很有用。此外,在 WAL 卷高的数据库中,每个目录中 WAL 文件的数量过多可能会成为性能和管理问题。增加 WAL 文件大小将减少 WAL 文件的数量。
其他不太常用的选项也可用
-c name=value--set name=value #在 initdb 期间强制将服务器参数 name 设置为 value,并将其设置写入生成的 postgresql.conf 文件,以便在将来的服务器运行时生效。此选项可以多次使用以设置多个参数。当环境导致服务器无法使用默认参数启动时,此选项主要很有用。
-d--debug #打印引导后端(bootstrap backend)的调试输出以及一些其他对公众不太重要的消息。引导后端是 initdb 用于创建目录表的程序。此选项会产生大量极其枯燥的输出。
--discard-caches #使用 debug_discard_caches=1 选项运行引导后端。这需要很长时间,仅对深度调试有用。
-L directory #指定 initdb 在何处查找其输入文件以初始化数据库集群。这通常不是必需的。如果您需要显式指定其位置,系统会告知您。
-n--no-clean #默认情况下,当 initdb 确定由于错误而无法完全创建数据库集群时,它会删除在发现无法完成工作之前可能创建的任何文件。此选项会抑制清理操作,因此对调试很有用。
-N--no-sync #默认情况下,initdb 会等待所有文件安全地写入磁盘。此选项导致 initdb 在不等待的情况下返回,这样更快,但这意味着后续的操作系统崩溃可能会导致数据目录损坏。通常,此选项对于测试很有用,但不应用于创建生产环境。
--no-sync-data-files #默认情况下,initdb 会将所有数据库文件安全地写入磁盘。此选项指示 initdb 跳过同步单个数据库目录中的所有文件、数据库目录本身以及表空间目录,即 base 子目录及其所有其他表空间目录中的所有内容。其他文件(例如 pg_wal 和 pg_xact 中的文件)仍将同步,除非还指定了 --no-sync 选项。
请注意,如果 --no-sync-data-files 与 --sync-method=syncfs 结合使用,则上述部分或全部文件和目录将被同步,因为 syncfs 会处理整个文件系统。
此选项主要供工具内部使用,这些工具会单独确保跳过的文件被同步到磁盘。
--no-instructions #默认情况下,initdb 会在其输出末尾写入有关如何启动集群的说明。此选项会导致这些说明被省略。这主要供包装 initdb 以实现特定于平台的行为的工具使用,在这些情况下,这些说明很可能是不正确的。
-s--show #显示内部设置并退出,不执行其他任何操作。这可用于调试 initdb 安装。
--sync-method=method #当设置为 fsync(这是默认值)时,initdb 将递归打开并同步数据目录中的所有文件。文件搜索将遵循 WAL 目录和每个配置的表空间的符号链接。
在 Linux 上,还可以使用 syncfs 来要求操作系统同步包含数据目录、WAL 文件和每个表空间的整个文件系统。有关使用 syncfs 时需要注意的注意事项,请参阅 recovery_init_sync_method。
当使用 --no-sync 时,此选项无效。
-S--sync-only #安全地将所有数据库文件写入磁盘并退出。这不会执行任何 initdb 的常规操作。通常,此选项对于在将 fsync 从 off 更改为 on 后确保可靠恢复很有用。
其他选项
initdb 也可以通过 pg_ctl initdb 调用。