postgres — PostgreSQL 数据库服务器
postgres
[选项
...]
postgres
是 PostgreSQL 数据库服务器。为了让客户端应用程序访问数据库,它会连接(通过网络或本地)到正在运行的 postgres
实例。然后,postgres
实例会启动一个单独的服务器进程来处理连接。
一个 postgres
实例始终管理一个数据库集群的数据。数据库集群是存储在公共文件系统位置(“数据区”)的一组数据库。一个系统上可以同时运行多个 postgres
实例,只要它们使用不同的数据区和不同的通信端口(见下文)即可。当 postgres
启动时,它需要知道数据区的位置。该位置必须由 -D
选项或 PGDATA
环境变量指定;没有默认值。通常,-D
或 PGDATA
直接指向由 initdb 创建的数据区目录。其他可能的文件布局在 第 20.2 节 中进行了讨论。
默认情况下,postgres
在前台启动,并将日志消息打印到标准错误流。在实际应用中,postgres
应作为后台进程启动,可能在启动时启动。
postgres
命令也可以在单用户模式下调用。此模式的主要用途是在 initdb 引导期间。有时它用于调试或灾难恢复;请注意,运行单用户服务器并不真正适合调试服务器,因为不会发生实际的进程间通信和锁定。当从 shell 中以单用户模式调用时,用户可以输入查询,结果将打印到屏幕上,但形式对开发人员比对最终用户更有用。在单用户模式下,会话用户将设置为 ID 为 1 的用户,并且向此用户授予隐式超级用户权限。此用户实际上不必存在,因此单用户模式可用于从某些类型的系统目录意外损坏中手动恢复。
postgres
接受以下命令行参数。有关选项的详细讨论,请参阅 第 20 章。您可以通过设置配置文件来避免键入大部分这些选项。一些(安全)选项还可以通过连接客户端以特定于应用程序的方式进行设置,仅适用于该会话。例如,如果设置了环境变量 PGOPTIONS
,则基于 libpq 的客户端会将该字符串传递给服务器,服务器会将其解释为 postgres
命令行选项。
-B nbuffers
设置服务器进程使用的共享缓冲区数。此参数的默认值由 initdb 自动选择。指定此选项等效于设置 shared_buffers 配置参数。
-c name
=value
设置一个已命名的运行时参数。由 PostgreSQL 支持的配置参数在 第 20 章 中进行了描述。事实上,大多数其他命令行选项都是此类参数分配的简写形式。-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
指定数据库配置文件的文件系统位置。有关详细信息,请参阅第 20.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
中将listen_addresses
设置为*
或通过-h
。
此选项已弃用,因为它不允许访问listen_addresses的全部功能。通常最好直接设置listen_addresses
。
-k directory
指定postgres
监听来自客户端应用程序的连接的 Unix 域套接字的目录。该值还可以是目录的逗号分隔列表。空值指定不监听任何 Unix 域套接字,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。默认值通常为/tmp
,但可以在构建时更改。指定此选项等效于设置unix_socket_directories配置参数。
-l
使用 SSL 启用安全连接。PostgreSQL 必须使用对 SSL 的支持编译,此选项才可用。有关使用 SSL 的更多信息,请参阅 第 19.9 节。
-N max-connections
设置此服务器将接受的最大客户端连接数。此参数的默认值由 initdb 自动选择。指定此选项等效于设置 max_connections 配置参数。
-p port
指定 postgres
侦听来自客户端应用程序的连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT
环境变量的值,或者如果未设置 PGPORT
,则默认为编译期间建立的值(通常为 5432)。如果您指定除默认端口以外的端口,则所有客户端应用程序都必须使用命令行选项或 PGPORT
指定相同的端口。
-s
在每个命令的末尾打印时间信息和其他统计信息。这对于基准测试或用于调整缓冲区数量很有用。
-S
work-mem
指定在使用临时磁盘文件之前,排序和哈希表要使用的基本内存量。请参阅 第 20.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
的失败消息可能表明您需要配置内核以提供足够的共享内存和信号量。有关更多讨论,请参阅 第 19.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.27.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
中编辑设置,而不是依赖命令行开关来设置参数。