postgres — PostgreSQL数据库服务器
postgres
[option
...]
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
or the pg_settings
视图。
-d debug-level
设置调试级别。数值设置得越高,写到服务器日志的调试输出就越多。取值范围是从 1 到 5。还可以针对某个特定会话使用-d 0
来阻止父postgres
进程的服务器日志级别被传播到这个会话。
-D datadir
指定数据库配置文件的文件系统位置。详见第 20.2 节。
-e
把默认日期风格设置为“European”,也就是输入日期域的顺序是DMY
。这也导致在一些日期输出格式中把日打印在月之前。详见第 8.5 节。
-F
禁用fsync
调用以提高性能,但是要冒系统崩溃时数据损坏的风险。指定这个选项等效于禁用fsync配置参数。在使用之前阅读详细文档!
-h hostname
指定postgres
监听来自客户端应用 TCP/IP 连接的 IP 主机名或地址。该值也可以是一个用逗号分隔的地址列表,或者*
表示监听所有可用的地址。一个空值表示不监听任何 IP 地址,在这种情况下可以使用 Unix 域套接字连接到服务器。缺省只监听localhost。声明这个选项等效于设置listen_addresses配置参数。默认只监听localhost。指定这个选项等效于设置listen_addresses配置参数。
-i
允许远程客户端使用 TCP/IP (互联网域)连接。没有这个选项,将只接受本地连接。这个选项等效于在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的更多信息,请参考第 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
选项仅仅是在有其他选择时不鼓励优化器使用这些计划类型。
-n
该选项主要用于调试导致服务器进程异常崩溃的问题。对付这种情况的一般策略是通知所有其它服务器进程,让它们终止并且接着重新初始化共享内存和信号量。这是因为一个错误的服务器进程可能在终止之前就已经对共享状态造成了破坏。该选项指定postgres
将不会重新初始化共享数据结构。一个有经验的系统程序员这时就可以使用调试器检查共享内存和信号量状态。
-O
允许修改系统表的结构。这个选项用于initdb
。
-P
读取系统表时忽略系统索引(但在更改系统表时仍然更新索引)。这在从损坏的系统索引中恢复时有用。
-t
pa[rser] | pl[anner] | e[xecutor]
打印与每个主要系统模块相关的查询的时间统计。这个选项不能和-s
选项一起使用。
-T
该选项主要用于调试导致服务器进程异常崩溃的问题。对付这种情况的一般策略是通知所有其它服务器进程,让它们终止并且接着重新初始化共享内存和信号量。这是因为一个错误的服务器进程可能在终止之前就已经对共享状态造成了破坏。该选项指定postgres
将通过发送SIGSTOP
信号停止其他所有服务器进程,但是并不让它们终止。这样就允许系统程序员手动从所有服务器进程收集内核转储。
-v
protocol
声明这次会话使用的前/后服务器协议的版本数。该选项仅在内部使用。
-W
seconds
在一个新服务器进程被启动时,它实施认证过程之后会延迟这个选项所设置的秒数。这就留出了机会来用一个调试器附着在服务器进程上。
下面的选项仅适用于单用户模式(见Single-User Mode)。
--single
选择单用户模式。这必须是命令行中的第一个选项。
database
指定要访问的数据库的名称。这必须是命令行中的最后一个参数。如果省略它,则默认为用户名。
-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
。在 SQL 中可调用的与这两种动作等效的命令可参考第 9.27.2 节中的pg_cancel_backend
和pg_terminate_backend
。
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 &
要用指定端口启动postgres
,例如 1234:
$
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
中的设置, 而不是倚赖命令行开关来设置参数。