postgres — PostgreSQL 数据库服务器
postgres
[选项
...]
postgres
是 PostgreSQL 数据库服务器。为了使客户端应用程序访问数据库,它会连接(通过网络或本地)到正在运行的 postgres
实例。然后,postgres
实例启动一个单独的服务器进程来处理连接。
一个 postgres
实例始终管理一个数据库集群的数据。数据库集群是存储在公共文件系统位置(“数据区”)的一组数据库。在系统上可以同时运行多个 postgres
实例,只要它们使用不同的数据区和不同的通信端口(见下文)。当 postgres
启动时,它需要知道数据区的位置。该位置必须由 -D
选项或 PGDATA
环境变量指定;没有默认值。通常,-D
或 PGDATA
直接指向由 initdb 创建的数据区目录。在 第 19.2 节 中讨论了其他可能的布局。
默认情况下,postgres
在前台启动,并将日志消息打印到标准错误流。在实际应用中,postgres
应该作为后台进程启动,可能在启动时启动。
postgres
命令也可以在单用户模式下调用。此模式的主要用途是通过 initdb 进行引导。有时它用于调试或灾难恢复;请注意,运行单用户服务器不真正适合调试服务器,因为不会发生真实的进程间通信和锁定。当从 shell 中以单用户模式调用时,用户可以输入查询,结果将打印到屏幕上,但形式对开发人员比最终用户更有用。在单用户模式下,会话用户将设置为 ID 为 1 的用户,并且此用户将被授予隐式超级用户权限。此用户实际上不必存在,因此单用户模式可用于手动从对系统目录的某些意外损坏中恢复。
postgres
接受以下命令行参数。有关选项的详细讨论,请参阅 第 19 章。您可以通过设置配置文件来节省键入大多数这些选项。某些(安全的)选项也可以从连接的客户端以应用程序依赖的方式设置,以便仅对该会话应用。例如,如果环境变量 PGOPTIONS
已设置,则基于 libpq 的客户端将该字符串传递给服务器,服务器将解释它为 postgres
命令行选项。
-B nbuffers
设置服务器进程使用的共享缓冲区数量。此参数的默认值由 initdb 自动选择。指定此选项等效于设置 shared_buffers 配置参数。
-c name
=value
设置命名运行时参数。PostgreSQL 支持的配置参数在 第 19 章 中进行了描述。大多数其他命令行选项实际上是此类参数分配的简写形式。 -c
可以多次出现以设置多个参数。
-C name
打印命名运行时参数的值并退出。(有关详细信息,请参见上面的 -c
选项。)这将返回来自 postgresql.conf
的值,并根据此调用中提供的任何参数进行修改。它不反映集群启动时提供的参数。
这可以在运行服务器上用于大多数参数。但是,对于某些运行时计算参数(例如,shared_memory_size、shared_memory_size_in_huge_pages 和 wal_segment_size),必须关闭服务器。
此选项旨在用于与服务器实例交互的其他程序,例如 pg_ctl,以查询配置参数值。面向用户的应用程序应该使用 SHOW
或 pg_settings
视图。
-d debug-level
设置调试级别。此值设置得越高,写入服务器日志的调试输出就越多。值为 1 到 5。也可以传递 -d 0
用于特定会话,这将阻止父 postgres
进程的服务器日志级别传播到此会话。
-D datadir
指定数据库配置文件的文件系统位置。有关详细信息,请参见 第 19.2 节。
-e
将默认日期样式设置为 “欧洲”,即输入日期字段的 DMY
顺序。这也会导致某些日期输出格式中先打印日期,然后打印月份。有关更多信息,请参见 第 8.5 节。
-F
禁用 fsync
调用以提高性能,但有在系统崩溃时发生数据损坏的风险。指定此选项等效于禁用 fsync 配置参数。在使用之前请阅读详细的文档!
-h hostname
指定 postgres
将在其上监听来自客户端应用程序的 TCP/IP 连接的 IP 主机名或地址。该值也可以是地址的逗号分隔列表,或者 *
表示监听所有可用接口。空值表示不在任何 IP 地址上监听,在这种情况下,只能使用 Unix 域套接字连接到服务器。默认情况下,只监听 localhost。指定此选项等效于设置 listen_addresses 配置参数。
-i
允许远程客户端通过 TCP/IP(Internet 域)连接连接。如果没有此选项,将只接受本地连接。此选项等效于在 postgresql.conf
中或通过 -h
将 listen_addresses
设置为 *
。
此选项已弃用,因为它不允许访问 listen_addresses 的全部功能。通常最好直接设置 listen_addresses
。
-k directory
指定 postgres
将在其上监听来自客户端应用程序的连接的 Unix 域套接字的目录。该值也可以是目录的逗号分隔列表。空值表示不在任何 Unix 域套接字上监听,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。默认值通常为 /tmp
,但可以在构建时更改。指定此选项等效于设置 unix_socket_directories 配置参数。
-l
启用使用SSL的安全连接。PostgreSQL 必须使用对SSL的支持进行编译,才能使用此选项。有关使用SSL的更多信息,请参见 第 18.9 节。
-N max-connections
设置此服务器将接受的客户端连接的最大数量。此参数的默认值由 initdb 自动选择。指定此选项等效于设置 max_connections 配置参数。
-p port
指定 postgres
将在其上监听来自客户端应用程序的连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认值为 PGPORT
环境变量的值,如果未设置 PGPORT
,则默认为编译期间建立的值(通常为 5432)。如果您指定了与默认端口不同的端口,则所有客户端应用程序必须使用命令行选项或 PGPORT
指定相同的端口。
-s
在每个命令结束时打印时间信息和其他统计信息。这对于基准测试或用于调整缓冲区数量很有用。
-S
work-mem
指定在诉诸临时磁盘文件之前,排序和哈希表使用的基本内存量。有关 work_mem
配置参数的描述,请参见 第 19.4.1 节。
-V
--version
打印 postgres 版本并退出。
--name
=value
设置一个命名的运行时参数;是 -c
的简写形式。
--describe-config
此选项以制表符分隔的 COPY
格式转储服务器的内部配置变量、描述和默认值。它主要设计用于管理工具。
-?
--help
显示有关 postgres 命令行参数的帮助,然后退出。
此处描述的选项主要用于调试目的,在某些情况下用于帮助恢复严重损坏的数据库。在生产数据库设置中没有理由使用它们。它们仅列出在此供 PostgreSQL 系统开发人员使用。此外,这些选项可能会在将来发布中更改或删除,恕不另行通知。
-f
{ s | i | o | b | t | n | m | h }
禁止使用特定的扫描和连接方法:s
和 i
分别禁用顺序扫描和索引扫描,o
、b
和 t
分别禁用仅索引扫描、位图索引扫描和 TID 扫描,而 n
、m
和 h
分别禁用嵌套循环、合并和哈希连接。
顺序扫描和嵌套循环连接都不能完全禁用;-fs
和 -fn
选项只是在优化器有其他备选方案时,阻止它使用这些计划类型。
-O
允许修改系统表的结构。这由 initdb
使用。
-P
在读取系统表时忽略系统索引,但在修改表时仍更新索引。当从损坏的系统索引中恢复时,这很有用。
-t
pa[rser] | pl[anner] | e[xecutor]
打印与每个主要系统模块相关的每个查询的计时统计信息。此选项不能与 -s
选项一起使用。
-T
此选项用于调试导致服务器进程异常死亡的问题。在这种情况下,通常的策略是通过向它们发送 SIGQUIT 信号来通知所有其他服务器进程它们必须终止。使用此选项,将发送 SIGABRT,从而生成核心转储文件。
-v
protocol
指定用于特定会话的前端/后端协议的版本号。此选项仅供内部使用。
-W
seconds
在新服务器进程启动后,它在进行身份验证过程后会延迟这么多秒。这旨在为使用调试器附加到服务器进程提供机会。
以下选项仅适用于单用户模式(请参阅以下 单用户模式)。
--single
选择单用户模式。这必须是命令行上的第一个参数。
database
指定要访问的数据库的名称。这必须是命令行上的最后一个参数。如果省略,则默认为用户名。
-E
在执行命令之前,将所有命令回显到标准输出。
-j
使用分号后跟两个换行符,而不是仅换行符作为命令条目终止符。
-r
filename
将所有服务器日志输出发送到 filename
。此选项仅在作为命令行选项提供时才有效。
PGCLIENTENCODING
客户端使用的默认字符编码。(客户端可以分别覆盖此设置。)此值也可以在配置文件中设置。
PGDATA
默认数据目录位置
PGDATESTYLE
运行时参数 DateStyle 的默认值。(使用此环境变量已过时。)
PGPORT
默认端口号(最好在配置文件中设置)
提到 semget
或 shmget
的错误消息可能表明您需要配置内核以提供足够的共享内存和信号量。有关更多讨论,请参见 第 18.4 节。您可以通过减少 shared_buffers 来减少 PostgreSQL 的共享内存消耗,或者通过减少 max_connections 来减少信号量消耗,从而推迟重新配置内核。
建议另一个服务器已经在运行的错误消息应仔细检查,例如使用以下命令
$
ps ax | grep postgres
或
$
ps -ef | grep postgres
取决于您的系统。如果您确定没有冲突的服务器正在运行,则可以删除消息中提到的锁定文件,然后重试。
指示无法绑定到端口的错误消息可能表明该端口已被某个非 PostgreSQL 进程使用。如果您终止 postgres
并立即使用相同的端口重新启动它,您也可能会收到此错误;在这种情况下,您只需等待几秒钟,直到操作系统关闭该端口,然后再重试。最后,如果您指定操作系统认为是保留的端口号,您可能会收到此错误。例如,许多版本的 Unix 将 1024 以下的端口号视为“受信任的”,并且只允许 Unix 超级用户访问它们。
实用程序命令 pg_ctl 可用于安全且舒适地启动和关闭 postgres
服务器。
如果可能,请不要使用 SIGKILL
来杀死主 postgres
服务器。这样做将阻止 postgres
在终止之前释放它持有的系统资源(例如,共享内存和信号量)。这可能会导致启动新的 postgres
运行出现问题。
要正常终止 postgres
服务器,可以使用 SIGTERM
、SIGINT
或 SIGQUIT
信号。第一个将等待所有客户端终止后再退出,第二个将强制断开所有客户端的连接,第三个将立即退出,而不进行正常关机,从而导致在重新启动期间进行恢复运行。
SIGHUP
信号将重新加载服务器配置文件。也可以将 SIGHUP
发送到单个服务器进程,但这通常没有意义。
要取消正在运行的查询,请将 SIGINT
信号发送到正在运行该命令的进程。要干净地终止后端进程,请将 SIGTERM
发送到该进程。另请参见 第 9.28.2 节 中的 pg_cancel_backend
和 pg_terminate_backend
,了解这两个操作的 SQL 可调用等效项。
postgres
服务器使用 SIGQUIT
来告诉子服务器进程在没有正常清理的情况下终止。用户不应使用此信号。向服务器进程发送 SIGKILL
也不明智——主 postgres
进程会将其解释为崩溃,并会强制所有兄弟进程作为其标准崩溃恢复过程的一部分退出。
--
选项在 FreeBSD 或 OpenBSD 上不起作用。请改用 -c
。这是受影响操作系统的错误;如果未修复,PostgreSQL 的未来版本将提供解决方法。
要启动单用户模式服务器,请使用类似以下的命令
postgres --single -D /usr/local/pgsql/data other-options
my_database
使用 -D
提供数据库目录的正确路径,或确保环境变量 PGDATA
已设置。还要指定要使用的特定数据库的名称。
通常,单用户模式服务器将换行符视为命令条目终止符;与 psql 中一样,它没有关于分号的智能。要将命令跨多行继续,您必须在除最后一个换行符以外的每个换行符之前键入反斜杠。反斜杠和相邻的换行符都将从输入命令中删除。请注意,即使在字符串文字或注释中,也会发生这种情况。
但是,如果您使用 -j
命令行开关,则单个换行符不会终止命令条目;相反,分号-换行符-换行符序列会终止命令条目。也就是说,键入一个分号,后跟一个完全空行。反斜杠-换行符在此模式下没有特殊处理。同样,在这种序列出现在字符串文字或注释中的情况下,没有智能。
在任何一种输入模式下,如果您键入的分号不只是在命令条目终止符之前或作为命令条目终止符的一部分,它将被视为命令分隔符。当您确实键入命令条目终止符时,您输入的多个语句将作为单个事务执行。
要退出会话,请键入EOF(Control+D,通常)。如果您在上次命令条目终止符之后输入了任何文本,那么EOF将被视为命令条目终止符,并且还需要另一个EOF才能退出。
请注意,单用户模式服务器不提供复杂的行编辑功能(例如,没有命令历史记录)。单用户模式也不执行任何后台处理,例如自动检查点或复制。
要使用默认值在后台启动 postgres
,请键入
$
nohup postgres >logfile 2>&1 </dev/null &
要使用特定端口(例如 1234)启动 postgres
$
postgres -p 1234
要使用 psql 连接到此服务器,请使用 -p 选项指定此端口
$
psql -p 1234
或设置环境变量 PGPORT
$
export PGPORT=1234
$
psql
命名的运行时参数可以用以下两种方式设置
$
postgres -c work_mem=1234
$
postgres --work-mem=1234
任何一种形式都会覆盖 postgresql.conf
中可能存在的 work_mem
设置。请注意,参数名称中的下划线可以在命令行中写成下划线或连字符。除了短期实验之外,最好在 postgresql.conf
中编辑设置,而不是依赖命令行开关来设置参数。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。