initdb — 创建新的 PostgreSQL 数据库集群
initdb
[选项
...] [ --pgdata
| -D
] 目录
initdb
创建新的 PostgreSQL 数据库集群。
创建数据库集群包括创建 目录(集群数据将驻留在其中),生成共享目录表(属于整个集群而不是任何特定数据库的表)以及创建 postgres
、template1
和 template0
数据库。 postgres
数据库是默认数据库,供用户、实用程序和第三方应用程序使用。 template1
和 template0
旨在作为源数据库,以便稍后由 CREATE DATABASE
命令复制。 template0
永远不应修改,但可以将对象添加到 template1
,默认情况下,这些对象将复制到稍后创建的数据库中。有关更多详细信息,请参见 第 23.3 节。
虽然 initdb
将尝试创建指定的数据目录,但如果所需数据目录的父目录归 root 所有,则它可能没有权限。要在这种设置中进行初始化,请以 root 创建一个空数据目录,然后使用 chown
将该目录的所有权分配给数据库用户帐户,然后 su
成为数据库用户以运行 initdb
。
initdb
必须作为将拥有服务器进程的用户运行,因为服务器需要访问 initdb
创建的文件和目录。由于服务器无法作为 root 运行,因此也不得将 initdb
作为 root 运行。(事实上,它会拒绝这样做。)
出于安全原因,默认情况下,只有集群所有者才能访问 initdb
创建的新集群。 --allow-group-access
选项允许与集群所有者在同一组中的任何用户读取集群中的文件。这对于以非特权用户身份执行备份很有用。
initdb
初始化数据库集群的默认语言环境和字符集编码。在创建每个数据库时,也可以分别为其设置这些内容。 initdb
确定模板数据库的这些设置,这些设置将作为所有其他数据库的默认设置。
默认情况下,initdb
使用区域设置提供程序 libc
(请参阅 第 24.1.4 节)。libc
区域设置提供程序从环境中获取区域设置,并根据区域设置确定编码。
要为集群选择不同的区域设置,请使用选项 --locale
。还有单独的选项 --lc-*
和 --icu-locale
(见下文)来设置各个区域设置类别的值。请注意,不同区域设置类别的设置不一致可能会产生无意义的结果,因此应谨慎使用。
或者,initdb
可以使用 ICU 库通过指定 --locale-provider=icu
来提供区域设置服务。服务器必须使用 ICU 支持进行构建。要选择要应用的特定 ICU 区域设置 ID,请使用选项 --icu-locale
。请注意,出于实现原因并为支持旧代码,initdb
在使用 ICU 区域设置提供程序时仍会选择并初始化 libc 区域设置。
当 initdb
运行时,它将打印出它选择的区域设置。如果您有复杂的要求或指定了多个选项,建议检查结果是否与预期相符。
有关区域设置的更多详细信息,请参阅 第 24.1 节。
要更改默认编码,请使用 --encoding
。有关更多详细信息,请参阅 第 24.3 节。
-A authmethod
--auth=authmethod
#此选项指定在 pg_hba.conf
(host
和 local
行)中使用的本地用户的默认身份验证方法。有关有效值的概述,请参阅 第 21.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 服务器支持的字符集在 第 24.3.1 节 中进行了描述。
默认情况下,模板数据库编码从区域设置派生。如果指定了 --no-locale
(或等效地,如果区域设置是 C
或 POSIX
),则 ICU 提供程序的默认值为 UTF8
,而 libc
提供程序的默认值为 SQL_ASCII
。
-g
--allow-group-access
#允许与集群所有者同组的用户读取 initdb
创建的所有集群文件。此选项在 Windows 上被忽略,因为它不支持 POSIX 样式的组权限。
--icu-locale=locale
#当使用 ICU 提供程序时,指定 ICU 区域设置。区域设置支持在 第 24.1 节 中描述。
--icu-rules=rules
#指定其他排序规则以自定义默认排序的行为。仅支持 ICU。
-k
--data-checksums
#对数据页使用校验和以帮助检测 I/O 系统的损坏,否则这些损坏将是静默的。启用校验和可能会产生明显的性能损失。如果设置,则会计算所有数据库中所有对象的校验和。所有校验和失败都将在 pg_stat_database
视图中报告。有关详细信息,请参见 第 30.2 节。
--locale=locale
#设置数据库集群的默认区域设置。如果未指定此选项,则区域设置将从 initdb
运行的环境中继承。区域设置支持在 第 24.1 节 中描述。
--lc-collate=语言环境
--lc-ctype=语言环境
--lc-messages=语言环境
--lc-monetary=语言环境
--lc-numeric=语言环境
--lc-time=语言环境
#与 --locale
类似,但仅设置指定类别中的语言环境。
--no-locale
#等效于 --locale=C
。
--locale-provider={libc
|icu
}
#此选项为在新建集群中创建的数据库设置语言环境提供程序。当随后创建新数据库时,可以在 CREATE DATABASE
命令中覆盖该设置。默认值为 libc
(请参见 第 24.1.4 节)。
-N
--no-sync
#默认情况下,initdb
将等待所有文件安全写入磁盘。此选项会导致 initdb
在不等待的情况下返回,速度更快,但意味着随后的操作系统崩溃可能会损坏数据目录。通常,此选项对于测试很有用,但创建生产安装时不应使用。
--no-instructions
#默认情况下,initdb
将在其输出的末尾编写有关如何启动集群的说明。此选项会导致省略这些说明。这主要用于将 initdb
封装在特定于平台的行为中的工具,其中这些说明可能不正确。
--pwfile=文件名
#使 initdb
从文件中读取引导超级用户的密码。该文件的首行将作为密码。
-S
--sync-only
#安全地将所有数据库文件写入磁盘并退出。此操作不会执行任何正常的 initdb 操作。通常,此选项对于在将 fsync 从 off
更改为 on
后确保可靠恢复非常有用。
-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
确定错误阻止其完全创建数据库集群时,它会删除在发现无法完成作业之前可能创建的任何文件。此选项会抑制清理,因此对于调试很有用。
其他选项
initdb
还可以通过 pg_ctl initdb
调用。