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
选择单用户模式。这必须是命令行上的第一个参数。
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
。有关这两个操作的 SQL 可调用等价项,请参阅 第 9.28.2 节 中的 pg_cancel_backend
和 pg_terminate_backend
。
postgres
服务器使用 SIGQUIT
来告诉从属服务器进程在没有正常清理的情况下终止。用户不应使用此信号。将 SIGKILL
发送给服务器进程也是不明智的——主 postgres
进程会将其解释为崩溃,并作为其标准崩溃恢复过程的一部分强制所有子进程退出。
--
选项在 FreeBSD 或 OpenBSD 上无效。请改用 -c
。这是受影响操作系统的一个 bug;如果此问题未修复,未来版本的 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
中编辑设置,而不是依赖命令行开关来设置参数。
如果您在文档中看到任何不正确、不符合您对特定功能的使用体验或需要进一步澄清的内容,请使用 此表单 报告文档问题。