2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

initdb

initdb — 创建新的 PostgreSQL 数据库集群

概要

initdb [选项...] [ --pgdata | -D ] 目录

描述

initdb 创建一个新的 PostgreSQL 数据库集群

创建数据库集群包括创建集群数据将存储在其中的目录、生成共享目录表(属于整个集群而不是任何特定数据库的表)以及创建 postgrestemplate1template0 数据库。 postgres 数据库是默认数据库,供用户、实用程序和第三方应用程序使用。 template1template0 旨在作为稍后 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 可以使用 ICU 库通过指定 --locale-provider=icu 来提供区域设置服务。服务器必须使用 ICU 支持进行构建。要选择要应用的特定 ICU 区域设置 ID,请使用选项 --icu-locale。请注意,出于实现原因并支持遗留代码,当使用 ICU 区域设置提供程序时,initdb 仍将选择和初始化 libc 区域设置。

initdb 运行时,它将打印出它选择的区域设置。如果您有复杂的要求或指定了多个选项,建议检查结果是否与预期相符。

有关区域设置的更多详细信息,请参见第 23.1 节

要更改默认编码,请使用 --encoding。更多详细信息,请参见第 23.3 节

选项

-A 认证方法
--auth=认证方法 #

此选项指定 pg_hba.confhostlocal 行)中使用的本地用户的默认身份验证方法。有关有效值的概述,请参见第 20.1 节

initdb 将使用指定的身份验证方法预填充 pg_hba.conf 条目,用于非复制以及复制连接。

除非您信任系统上的所有本地用户,否则请勿使用 trusttrust 是为了方便安装而设置的默认值。

--auth-host=认证方法 #

此选项指定 pg_hba.confhost 行)中使用的通过 TCP/IP 连接的本地用户的身份验证方法。

--auth-local=认证方法 #

此选项指定 pg_hba.conflocal 行)中使用的通过 Unix 域套接字连接的本地用户的身份验证方法。

-D 目录
--pgdata=目录 #

此选项指定应存储数据库集群的目录。这是 initdb 唯一需要的信息,但您可以通过设置 PGDATA 环境变量来避免编写它,这可能很方便,因为数据库服务器 (postgres) 稍后可以通过相同的变量找到数据目录。

-E 编码
--encoding=编码 #

选择模板数据库的编码。这也将成为您稍后创建的任何数据库的默认编码,除非您在创建时将其覆盖。 PostgreSQL 服务器支持的字符集在第 23.3.1 节中进行了描述。

默认情况下,模板数据库编码是从区域设置派生的。如果指定了--no-locale(或等效地,如果区域设置为 CPOSIX),则对于 ICU 提供程序,默认为 UTF8,对于 libc 提供程序,默认为 SQL_ASCII

-g
--allow-group-access #

允许与集群所有者位于同一组的用户读取 initdb 创建的所有集群文件。此选项在 Windows 上被忽略,因为它不支持POSIX-样式组权限。

--icu-locale=区域设置 #

使用 ICU 提供程序时指定 ICU 区域设置。区域设置支持在第 23.1 节中进行了描述。

--icu-rules=规则 #

指定其他排序规则以自定义默认排序规则的行为。仅在 ICU 中支持此功能。

-k
--data-checksums #

在数据页上使用校验和以帮助检测 I/O 系统可能导致的无声损坏。启用校验和可能会产生明显的性能损失。如果设置,则将为所有数据库中的所有对象计算校验和。所有校验和错误都将在pg_stat_database 视图中报告。有关详细信息,请参见第 28.2 节

--locale=区域设置 #

设置数据库集群的默认区域设置。如果未指定此选项,则区域设置将从 initdb 运行所在的环境中继承。区域设置支持在第 23.1 节中进行了描述。

如果 --locale-providerbuiltin,则必须指定 --locale--builtin-locale 并将其设置为 CC.UTF-8

--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 节)。

--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-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 #

打印来自引导后端和一些其他消息的调试输出,这些消息对于公众来说不太重要。引导后端是 initdb 用于创建目录表的程序。此选项会生成大量极其无聊的输出。

--discard-caches #

使用 debug_discard_caches=1 选项运行引导后端。这需要很长时间,并且仅用于深度调试。

-L directory #

指定 initdb 应该在哪里找到其输入文件以初始化数据库集群。这通常不是必需的。如果需要显式指定其位置,系统会告知您。

-n
--no-clean #

默认情况下,当 initdb 确定错误阻止它完全创建数据库集群时,它会删除它在发现无法完成工作之前可能创建的任何文件。此选项抑制整理,因此对于调试很有用。

-N
--no-sync #

默认情况下,initdb 将等待所有文件安全写入磁盘。此选项导致 initdb 在不等待的情况下返回,这更快,但意味着随后的操作系统崩溃可能会导致数据目录损坏。通常,此选项用于测试,但不应在创建生产安装时使用。

--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 操作。通常,此选项用于确保在将 fsyncoff 更改为 on 后可靠恢复。

其他选项

-V
--version #

打印 initdb 版本并退出。

-?
--help #

显示有关 initdb 命令行参数的帮助,并退出。

环境

PGDATA #

指定存储数据库集群的目录;可以使用 -D 选项覆盖。

PG_COLOR #

指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

TZ #

指定创建的数据库集群的默认时区。该值应为完整时区名称(参见第 8.5.3 节)。

备注

initdb 也可以通过 pg_ctl initdb 调用。

另请参阅

pg_ctlpostgres第 20.1 节

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。