在任何人访问数据库之前,你必须启动数据库服务器。数据库服务器程序称为 postgres
.
如果您使用的是 PostgreSQL 的预打包版本,它几乎肯定包含根据操作系统的惯例将服务器作为后台任务运行的设置。使用该软件包的基础结构启动服务器的工作量会比自己想办法启动要小得多。有关详细信息,请参阅软件包级文档。
手动启动服务器的基本方法是直接调用 postgres
,并使用 -D
选项指定数据目录的位置,例如
$ postgres -D /usr/local/pgsql/data
这会使服务器在前端运行。必须以 PostgreSQL 用户帐户登录后才能执行此操作。如果不使用 -D
,服务器将尝试使用环境变量 PGDATA
指定的数据目录。如果该变量也未提供,它将失败。
通常,最好在后台启动 postgres
。为此,请使用通常的 Unix shell 语法
$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &
重要的是将服务器的 stdout 和 stderr 输出存储在某个位置,如上所示。它将有助于审计目的和诊断问题。(请参阅 第 24.3 节 以更透彻地讨论日志文件处理。)
postgres
程序还可以接受其他一些命令行选项。有关更多信息,请参阅 postgres 参考页和以下 第 19 章。
这种 shell 语法很快会变得乏味。因此,包装程序 pg_ctl 用于简化一些任务。例如
pg_ctl start -l logfile
将在后台启动服务器并将输出放入命名的日志文件中。 -D
选项在此处的含义与用于 postgres
的含义相同。 pg_ctl
还能够停止服务器。
通常,您希望在计算机启动时启动数据库服务器。 自动启动脚本是特定于操作系统的。 PostgreSQL 在 contrib/start-scripts
目录中分发了一些示例脚本。安装其中一个需要 root 权限。
不同的系统有不同的契约在启动时启动守护进程。许多系统有一个文件 /etc/rc.local
或 /etc/rc.d/rc.local
。其他使用 init.d
或 rc.d
目录。无论你做什么,服务器必须由 PostgreSQL 用户账户 而不是通过 root 或任何其他用户运行。因此你大概应当使用 su postgres -c '...'
来组成您的命令。例如
su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'
这里有一些更多的操作系统特定建议。(在每个案例中都务必在我们的通用值中展示正确的安装目录和用户名。)
对于 FreeBSD,查看 PostgreSQL 源分布中的文件 contrib/start-scripts/freebsd
。
在 OpenBSD 上,将以下行添加到文件 /etc/rc.local
中:
if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then su -l postgres -c '/usr/local/pgsql/bin/pg_ctl start -s -l /var/postgresql/log -D /usr/local/pgsql/data' echo -n ' postgresql' fi
/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data
到 /etc/rc.d/rc.local
或 /etc/rc.local
,要么查看 PostgreSQL 源代码中的文件 contrib/start-scripts/linux
。
当使用 systemd 时,您可以使用以下服务单元文件(例如,在 /etc/systemd/system/postgresql.service
):
[Unit] Description=PostgreSQL database server Documentation=man:postgres(1) After=network-online.target Wants=network-online.target [Service] Type=notify User=postgres ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT TimeoutSec=infinity [Install] WantedBy=multi-user.target
使用 Type=notify
,要求使用 configure --with-systemd
构建服务器二进制文件。
仔细考虑超时设置。systemd 从此写作开始有 90 秒的默认超时,并且会在在该时间内没有报告准备就绪的进程中杀死他。但是,一个可能必须在启动时执行故障恢复的 PostgreSQL 服务器可能需要更长的时间才能做好准备。建议的值 infinity
禁用超时逻辑。
在 Solaris 上,创建一个名为 /etc/init.d/postgresql
的文件,其中包含以下行:
su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data"
然后,创建一个符号链接到 /etc/rc3.d
中的文件 S99postgresql
。
当服务器运行时,它PID存储在数据目录中的 postmaster.pid
文件中。用于防止多个服务器实例在同一数据目录中运行,还可用于关闭服务器。
服务器可能无法启动的原因有很多。检查服务器日志文件,或者手动启动它(不重定向标准输出或标准错误),看看出现什么错误消息。下面我们更详细地解释一些最常见的错误消息。
LOG: could not bind IPv4 address "127.0.0.1": Address already in use HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry. FATAL: could not create any TCP/IP sockets
这通常来说意味着它提示的内容:您尝试在另一个服务器正在运行的同一端口上启动另一个服务器。但是,如果内核错误消息不是 地址已被使用
或该错误变体,则可能是其他问题。例如,尝试在保留的端口号上启动服务器可能绘制像
$ postgres -p 666
LOG: could not bind IPv4 address "127.0.0.1": Permission denied
HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL: could not create any TCP/IP sockets
类似如下的消息
FATAL: could not create shared memory segment: Invalid argument DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600).
可能意味着内核对共享内存大小的限制小于 PostgreSQL 尝试创建的工作区(此例中为 4011376640 字节)。这种情况通常只会在将 shared_memory_type
设置为 sysv
时发生。在这种情况下,您可以尝试使用少于正常数量的缓冲区 (shared_buffers) 启动服务器,或重新配置内核以增加允许的共享内存大小。如果您尝试在同一台计算机上启动多个服务器,而其请求的总空间超过内核限制,则您也可能看到此消息。
类似如下的错误
FATAL: could not create semaphores: No space left on device DETAIL: Failed system call was semget(5440126, 17, 03600).
不表示您已用尽磁盘空间。表示内核限制的 System V 信号量数量少于 PostgreSQL 想要创建的数量。如上所述,您可以通过减少允许的连接数量(max_connections)来解决问题,但最终您需要增加内核限制。
有关配置 System V 的详细信息IPC工具提供了 第 18.4.1 节 中。
虽然客户端可能出现的错误条件多种多样且依赖于应用程序,但其中一些可能与服务器启动方式直接相关。除了以下所示条件之外,应在各个客户端应用程序中记录其他条件。
psql: error: connection to server at "server.joe.com" (123.123.123.123), port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections?
这是通用 “我没有找到服务器进行通信” 故障。当尝试 TCP/IP 通信时,看起来就像上面一样。常见错误是忘记配置服务器以允许 TCP/IP 连接。
或者,您可能会在尝试对本地服务器进行 Unix 域套接字通信时收到此消息
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket?
如果服务器确实正在运行,请检查客户端的套接字路径理念(此处为 /tmp
)是否与服务器的 unix_socket_directories 设置相符。
连接故障消息始终会显示服务器地址或套接字路径名称,这有助于验证客户端是否试图连接到正确的位置。如果实际上没有服务器在那里监听,内核错误消息通常会像所示那样,要么是 Connection refused
,要么是 No such file or directory
。(重要的是意识到在这种情况下,Connection refused
并不 意味着服务器收到了您的连接请求并拒绝了它。这种情况下会产生不同的消息,如 第 20.15 节 中所示。)其他错误消息,如 Connection timed out
,可能表明存在更基本的问题,如缺乏网络连接或防火墙阻止连接。