initdb — 创建一个新的 PostgreSQL 数据库集群
initdb [option...] [ --pgdata | -D ] directory
initdb 创建一个新的 PostgreSQL 数据库集群。
创建数据库集群包括:创建将存放集群数据的目录,生成共享目录表(属于整个集群而非任何特定数据库的表),以及创建 postgres、template1 和 template0 数据库。postgres 数据库是一个默认数据库,供用户、工具和第三方应用程序使用。template1 和 template0 用作源数据库,供后续的 CREATE DATABASE 命令复制。template0 绝对不应被修改,但你可以向 template1 添加对象,这些对象默认会被复制到之后创建的数据库中。更多细节请参见 Section 22.3。
虽然 initdb 会尝试创建指定的数据目录,但如果所需数据目录的父目录为 root 所有,它可能没有相应的权限。要在这样的环境中进行初始化,请以 root 身份创建一个空的数据目录,然后使用 chown 把该目录的属主分配给数据库用户账户,再通过 su 切换为数据库用户来运行 initdb。
initdb 必须以将要拥有服务器进程的用户身份运行,因为服务器需要能够访问 initdb 创建的文件和目录。由于服务器不能以 root 身份运行,你也不应当以 root 身份运行 initdb。(事实上它会拒绝这样做。)
出于安全考虑,默认情况下 initdb 创建的新集群只有集群所有者才能访问。--allow-group-access 选项允许与集群所有者同组的任何用户读取集群中的文件。这对于以非特权用户身份执行备份很有用。
initdb 会初始化数据库集群的默认区域设置和字符集编码。在创建每个数据库时,也可以单独设置这些内容。initdb 会为模板数据库确定这些设置,它们将作为所有其他数据库的默认值。
默认情况下,initdb 使用区域设置提供程序 libc(参见 Section 23.1.4)。libc 区域设置提供程序从环境中获取区域设置,并根据区域设置确定编码。
要为集群选择一个不同的区域设置,请使用选项 --locale。还有一些单独的选项 --lc-* 和 --icu-locale(见下文)用于设置各个区域设置类别的值。请注意,对不同区域设置类别进行不一致的设置可能产生无意义的结果,因此应当谨慎使用。
或者,initdb 可以通过指定 --locale-provider=icu 来使用 ICU 库提供区域设置服务。服务器必须在构建时带有 ICU 支持。要选择要应用的特定 ICU 区域设置 ID,请使用选项 --icu-locale。请注意,出于实现方面的原因以及为了支持遗留代码,当使用 ICU 区域设置提供程序时,initdb 仍会选择并初始化 libc 区域设置。
initdb 运行时,会打印出它所选定的区域设置。如果你有复杂的需求或者指定了多个选项,建议检查结果是否符合你的预期。
有关区域设置的更多细节可以在 Section 23.1 中找到。
要更改默认编码,请使用 --encoding。更多细节可以在 Section 23.3 中找到。
-A authmethod--auth=authmethod #
这个选项为 pg_hba.conf 的 host 和
local 行指定本地用户使用的默认认证方法。有关有效值的概述,请参见
Section 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 服务器支持的字符集在 Section 23.3.1 中有描述。
默认情况下,模板数据库的编码源自区域设置。如果指定了 --no-locale(或者等效地,如果区域设置为 C 或 POSIX),那么默认值为 UTF8(ICU 提供程序)和 SQL_ASCII(libc 提供程序)。
-g--allow-group-access # 允许与集群所有者同组的用户读取 initdb 创建的所有集群文件。此选项在 Windows 上会被忽略,因为它不支持 POSIX 风格的组权限。
--icu-locale=locale #指定使用 ICU 提供程序时的 ICU 区域设置。区域设置支持在 Section 23.1 中有描述。
--icu-rules=rules #指定额外的排序规则,用于自定义默认排序规则的行为。此功能仅 ICU 支持。
-k--data-checksums # 在数据页上使用校验和,以帮助检测 I/O 系统造成的损坏,否则这些损坏将无法被察觉。默认情况下此功能是启用的;使用 --no-data-checksums 可以禁用校验和。
启用校验和可能会带来轻微的性能损失。如果启用,将对所有数据库中的所有对象计算校验和。所有校验和失败都会在 pg_stat_database 视图中报告。详情请参见 Section 28.2。
--locale=locale # 设置数据库集群的默认区域设置。如果未指定此选项,则区域设置继承自 initdb 运行时所处的环境。区域设置支持在 Section 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 #
Equivalent to --locale=C.
--builtin-locale=locale #指定使用内建提供程序时的区域设置名称。区域设置支持在 Section 23.1 中有描述。
--locale-provider={builtin|libc|icu} # 此选项为新集群中创建的数据库设置区域设置提供程序。在随后创建新数据库时,可以在 CREATE DATABASE 命令中覆盖它。默认值为 libc(参见 Section 23.1.4)。
--no-data-checksums #不启用数据校验和。
--pwfile=filename # 让 initdb 从一个文件中读取引导超级用户的密码。该文件的第一行将被作为密码。
-T config--text-search-config=config #设置默认的文本搜索配置。更多信息请参见 default_text_search_config。
-U username--username=username #-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 #
强制将服务器参数 name
设置为 value,该设置在 initdb
期间应用,并且还会被写入生成的 postgresql.conf
文件中,从而在以后的服务器运行中也生效。此选项可以被指定多次以设置多个参数。
当环境导致服务器使用默认参数根本无法启动时,此选项最为有用。
-d--debug # 打印来自引导后端的调试输出,以及一些对普通用户来说不太重要的其他消息。引导后端是 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 文件和每个表空间的整个文件系统。请参见 recovery_init_sync_method,以了解使用 syncfs 时需要注意的事项。
当使用 --no-sync 时,此选项没有任何效果。
-S--sync-only # 将所有数据库文件安全地写入磁盘,然后退出。这不会执行任何正常的 initdb 操作。一般来说,此选项适用于在将 fsync 从 off 改为 on 之后确保可靠的恢复。
Other options:
PGDATA # 指定应存储数据库集群的目录;可以使用 -D 选项覆盖。
PG_COLOR # 指定是否在诊断消息中使用颜色。可能的值为 always、auto 和 never。
TZ #指定所创建数据库集群的默认时区。该值应当是一个完整的时区名称(参见 Section 8.5.3)。
initdb 也可以通过 pg_ctl initdb 来调用。