# 19.3.启动数据库服务器

19.3.1. 服务器启动失败

19.3.2. 客户端连接问题

在任何人访问数据库之前,必须先启动数据库服务器。数据库服务器程序称为博士后.

如果您使用的是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。地方的.其他人使用初始化。Drc。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
    
  • 在Linux系统上,添加

    /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将禁用超时逻辑。

  • 在NetBSD上,根据偏好使用FreeBSD或Linux启动脚本。

  • 在Solaris上,创建一个名为/etc/init。d/postgresql包含以下行:

    su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data"
    

    然后,在中创建指向它的符号链接/etc/rc3.DS99postgresql.

    服务器运行时,其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节)其他错误消息,例如连接超时这可能意味着更根本的问题,比如缺乏网络连接,或者防火墙阻止了连接。