# 19.3.启动数据库服务器
在任何人访问数据库之前,必须先启动数据库服务器。数据库服务器程序称为博士后
.
如果您使用的是PostgreSQL的预打包版本,它几乎肯定会根据您的操作系统的约定,将服务器作为后台任务运行。使用包的基础设施来启动服务器比自己弄清楚如何启动要简单得多。有关详细信息,请参阅软件包级文档。
手动启动服务器的基本方法就是调用博士后
直接使用-D
选项,例如:
$ postgres -D /usr/local/pgsql/data
这将使服务器在前台运行。这必须在登录PostgreSQL用户帐户时完成。没有-D
,服务器将尝试使用环境变量命名的数据目录PGDATA
.如果也不提供该变量,它将失败。
通常情况下,最好先开始博士后
在后台。为此,请使用常用的Unix shell语法:
$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &
如上所示,将服务器的stdout和stderr输出存储在某个地方非常重要。它将有助于审计目的和诊断问题。(见第25.3节以更深入地讨论日志文件处理。)
这个博士后
该程序还接受许多其他命令行选项。有关更多信息,请参阅博士后参考页和第20章在下面
这种shell语法很快就会变得单调乏味。因此,包装程序pg_ctl用于简化某些任务。例如:
pg_ctl start -l logfile
将在后台启动服务器,并将输出放入命名的日志文件中。这个-D
选项在这里的含义与博士后
. pg_ctl
还能够停止服务器。
通常情况下,您需要在计算机启动时启动数据库服务器。Autostart脚本是特定于操作系统的。下面是一些与PostgreSQL一起发布的示例脚本控制/启动脚本
目录安装一个需要root权限。
不同的系统在启动时启动守护程序有不同的约定。许多系统都有一个文件/etc/rc。地方的
或/etc/rc。d/rc。地方的
.其他人使用初始化。D
或rc。D
目录。无论您做什么,服务器都必须由PostgreSQL用户帐户运行而不是根或任何其他用户。因此,您可能应该使用su postgres-c'…'
.例如:
su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'
下面是一些针对操作系统的建议。(在每种情况下,请确保使用正确的安装目录和用户名,在其中显示通用值。)
对于FreeBSD,请查看该文件
contrib/start scripts/freebsd
在PostgreSQL源代码发行版中。在OpenBSD上,向文件中添加以下行
/etc/rc。地方的
: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。地方的
或/etc/rc。地方的
或者看看文件contrib/start scripts/linux
在PostgreSQL源代码发行版中。使用systemd时,您可以使用以下服务单元文件(例如:
/etc/systemd/system/postgresql。服务
):[Unit] Description=PostgreSQL database server Documentation=man:postgres(1) [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=0 [Install] WantedBy=multi-user.target
使用
类型=通知
要求服务器二进制文件是用配置——使用systemd
.仔细考虑超时设置。systemd在写这篇文章时有一个默认的90秒超时,它将终止一个在此时间内没有通知就绪的进程。但在启动时可能需要执行崩溃恢复的PostgreSQL服务器可能需要更长的时间才能准备就绪。建议值0将禁用超时逻辑。
在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存储在文件中
邮政局长。pid
在数据目录中。这用于防止多个服务器实例在同一数据目录中运行,也可用于关闭服务器。
# 19.3.1.服务器启动失败
服务器可能无法启动有几个常见原因。检查服务器的日志文件,或手动启动(不重定向标准输出或标准错误),查看出现的错误消息。下面我们将更详细地解释一些最常见的错误消息。
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试图创建的工作区(本例中为401376640字节)。只有当你设置了共享内存类型
到sysv
.在这种情况下,您可以尝试使用少于正常数量的缓冲区启动服务器(共享_缓冲区),或者重新配置内核以增加允许的共享内存大小。当试图在同一台机器上启动多个服务器时,如果请求的总空间超过内核限制,您可能还会看到此消息。
错误如下:
FATAL: could not create semaphores: No space left on device
DETAIL: Failed system call was semget(5440126, 17, 03600).
做不意味着你的磁盘空间用完了。这意味着内核对SystemV信号量数量的限制小于PostgreSQL想要创建的数量。如上所述,您可以通过减少允许的连接数来启动服务器,从而解决这个问题(最大值_连接),但您最终会希望增加内核限制。
有关配置System V IPC设施的详细信息,请参阅第19.4.1节.
# 19.3.2.客户端连接问题
尽管客户端可能出现的错误情况多种多样,且依赖于应用程序,但其中一些可能与服务器的启动方式直接相关。除以下所示情况外,还应在相应的客户应用程序中记录其他情况。
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_插座_目录背景
连接失败消息始终显示服务器地址或套接字路径名,这对于验证客户端是否尝试连接到正确的位置非常有用。如果实际上没有服务器在监听,内核错误消息通常是连接被拒绝
或没有这样的文件或目录
,如图所示。(重要的是要认识到这一点连接被拒绝
在这种情况下不这意味着服务器收到了你的连接请求并拒绝了它。这种情况将产生不同的消息,如中所示第21.15节)其他错误消息,例如连接超时
这可能意味着更根本的问题,比如缺乏网络连接,或者防火墙阻止了连接。