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
指定在求助于临时磁盘文件之前,排序和哈希表使用的基本内存量。请参阅 第 19.4.1 节中 work_mem
配置参数的描述。
-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
选择单用户模式。这必须是命令行上的第一个参数。
数据库
指定要访问的数据库的名称。这必须是命令行上的最后一个参数。如果省略,则默认为用户名。
-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
中的设置可能比依赖命令行开关来设置参数更好。
如果您发现文档中的任何内容不正确,与您使用特定功能的经验不符或需要进一步澄清,请使用 此表单 报告文档问题。