为啥我的 Postgres 数据库工作了一段时间,然后重新启动后无法“启动服务器”?

Posted

技术标签:

【中文标题】为啥我的 Postgres 数据库工作了一段时间,然后重新启动后无法“启动服务器”?【英文标题】:Why is my Postgres database working for a while and then not able to "start server" once restarted?为什么我的 Postgres 数据库工作了一段时间,然后重新启动后无法“启动服务器”? 【发布时间】:2021-05-02 10:25:51 【问题描述】:

最近,我开始使用旧的 Raspberry Pi 3 b+,我认为在我的本地网络上托管一个 Postgres 数据库并将其用于我想要解决的任何问题是一个很好的做法。我知道在具有 1GB 内存的 Raspberry Pi 上运行 Postgres 并不理想,并且可能会对 SD 卡造成影响,但我已经更新了 postgresql.conf 文件并指定数据目录路径是使用 1TB SSD。此外,我还安装了 zram 和 log2ram 来尝试减少 SD 卡上的一些开销。

我正在使用的技术概述:

树莓派 3 B+ Postgres 12 Ubuntu 服务器 20.04(无 gui,仅在终端上工作) 1TB 固态硬盘

昨天,我正在从 python 笔记本写入 Postgres 数据库,没有任何问题,但是一旦我重新启动 Raspberry Pi,我无法从 DataGrip 访问数据库,并且会从我的 Ubuntu 终端收到以下错误:

psql: error: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我检查了 postgres 服务器的状态,似乎没问题...:

● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Thu 2021-01-28 13:34:41 UTC; 20min ago
    Process: 1895 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 1895 (code=exited, status=0/SUCCESS)

Jan 28 13:34:41 ubuntu systemd[1]: Starting PostgreSQL RDBMS...
Jan 28 13:34:41 ubuntu systemd[1]: Finished PostgreSQL RDBMS.

这是 postgresql-12-main.log 中提供的内容:

2021-01-28 13:17:23.344 UTC [1889] LOG:  starting PostgreSQL 12.5 (Ubuntu 12.5-0ubuntu0.20.04.1) on aarch64-unknown-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
2021-01-28 13:17:23.362 UTC [1889] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2021-01-28 13:17:23.362 UTC [1889] LOG:  listening on IPv6 address "::", port 5432
2021-01-28 13:17:23.365 UTC [1889] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-01-28 13:17:23.664 UTC [1899] LOG:  database system was shut down at 2021-01-28 01:43:38 UTC
2021-01-28 13:17:24.619 UTC [1899] LOG:  could not link file "pg_wal/xlogtemp.1899" to "pg_wal/000000010000000000000002": Operation not permitted
2021-01-28 13:17:24.670 UTC [1899] FATAL:  could not open file "pg_wal/000000010000000000000002": No such file or directory
2021-01-28 13:17:24.685 UTC [1889] LOG:  startup process (PID 1899) exited with exit code 1
2021-01-28 13:17:24.686 UTC [1889] LOG:  aborting startup due to startup process failure
2021-01-28 13:17:24.708 UTC [1889] LOG:  database system is shut down
pg_ctl: could not start server
Examine the log output.

如果您有任何问题或希望我提供任何其他信息,请告诉我。感谢您提前提供的任何指示。

【问题讨论】:

updated the postgresql.conf file 您还应该编辑/etc/init.d/postgresql 文件,其中数据目录用作 DBMS 进程的命令行参数。此外,您还可以将整个根 FS 移动到 SSD,只在 SD 卡上保留引导。 感谢@wildplasser,我会检查一下。 @wildplasser 我相信我已经在 SSD 上拥有了整个 FS,但我不确定是否要编辑 /etc/init.d/postgresql 文件。你有什么材料可以说明这个过程吗? 你去... 这个运气好吗?重新启动树莓派 4 后,我遇到了完全相同的问题 【参考方案1】:

配置文件(部分):


#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.

#data_directory = 'ConfigDir'           # use data in another directory
                                        # (change requires restart)
#hba_file = 'ConfigDir/pg_hba.conf'     # host-based authentication file
                                        # (change requires restart)
#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
                                        # (change requires restart)

# If external_pid_file is not explicitly set, no extra PID file is written.
#external_pid_file = ''                 # write an extra PID file
                                        # (change requires restart)

/etc/init.d/postgresql(部分):

注意:这是来自非标准安装。 YMMV


# Data directory
#PGDATA="/data/db/postgres"
#PGDATA="/data/db/postgres/pgdata"
#PGDATA="/data/db/postgres-12/pgdata"

PGDATA="/data/db/postgres-11/pgdata"

(升级时,我倾向于保留注释掉的旧设置以供参考)

注意:配置文件没有被编辑,每个路径都指向 ConfigDir(默认)

另外,对于 Pi 上的 Postgres,我设置:


random_page_cost = 1.1 
shared_buffers = 128MB
#work_mem = 4MB # keep the low default
effective_cache_size = 3GB # This is for a RaspberryPi-4
                           # for a Pi-3, I'd use ~700M

【讨论】:

感谢您发布@wildplasser。所以,我已经更新了配置文件并使用我的目录编辑了#data_directory = 'ConfigDir',并且工作正常。我很好奇为什么我没有在 /etc/init.d/postgres 文件中看到您添加了 PGDATA="/data/db/postgres-11/pgdata" 行的“数据目录”部分,除非您自己这样做。内存使用的好技巧。 我不确定这是否是正确的程序,但我已将文件内容包含在下面的 `/etc/init.d/porstgresql/ @wildplasser 的答案中 init.d 文件的样式取决于包系统(我的可能来自 Suze,我不记得了)。 shell 变量在您的情况下可能被称为不同。 T尝试找到脚本调用 postgres 的行。【参考方案2】:

这是 /etc/init.d/postgres 文件的样子:::

#!/bin/sh
set -e

### BEGIN INIT INFO
# Provides:             postgresql
# Required-Start:       $local_fs $remote_fs $network $time
# Required-Stop:        $local_fs $remote_fs $network $time
# Should-Start:         $syslog
# Should-Stop:          $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    PostgreSQL RDBMS server
### END INIT INFO


# Setting environment variables for the postmaster here does not work; please
# set them in /etc/postgresql/<version>/<cluster>/environment instead.

[ -r /usr/share/postgresql-common/init.d-functions ] || exit 0

. /usr/share/postgresql-common/init.d-functions

# versions can be specified explicitly
if [ -n "$2" ]; then
    versions="$2 $3 $4 $5 $6 $7 $8 $9"
else
    get_versions
fi

case "$1" in
    start|stop|restart|reload)
        if [ "$1" = "start" ]; then
            create_socket_directory
        fi
        if [ -z "`pg_lsclusters -h`" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        for v in $versions; do
            $1 $v || EXIT=$?
        done
        exit $EXIT:-0
        ;;
    status)
        LS=`pg_lsclusters -h`
        # no clusters -> unknown status
        [ -n "$LS" ] || exit 4
        echo "$LS" | awk 'BEGIN rc=0 if (match($4, "down")) rc=3; printf ("%s/%s (port %s): %s\n", $1, $2, $3, $4); END exit rc'
        ;;
    force-reload)
        for v in $versions; do
            reload $v
        done
        ;;
    *)
        echo "Usage: $0 start|stop|restart|reload|force-reload|status [version ..]"
        exit 1
        ;;
esac

exit 0

【讨论】:

现在对这个脚本进行逆向工程,并尝试找出它从哪里得到它的 PGDATA(s)。 (可能是init.d-functions :竖起大拇指:,先生/妈妈 嗯,我还没弄明白。会继续尝试,如果找到解决方案会更新。【参考方案3】:

好的,我想我已经想通了。可能有点矫枉过正,但它有效:

    我做的第一件事是格式化并安装我的 1TB SSD。 Here 是一个很好的视频,用于格式化为 ext4 和安装。视频之间的区别在于我更新了 fstab 文件以在启动期间检查我的 SSD,或者在 SSD 挂载选项的末尾显示“0 2”而不是“0 0”。

    其次,我安装了 Postgres。 Here 是一个很好的演练。该博客中提供的指导超出了我的需要,但仍然是一个很好的演练。我只是安装了 Postgres:

sudo apt install postgresql postgresql-contrib
    第三,我跟着this演练直到第二步结束,但在开始第二步之前,我通过执行添加了一个从/var/lib/postgresql/12/main/YOUR/MOUNT/POSITION/postgresql/12/main的符号链接:
ln -s /var/lib/postgresql/12/main /YOUR/MOUNT/POSITION/postgresql/12/main
    最后,在重启 postgres 服务器之前,我使用了this 网站来帮助我更好地配置我的服务器。输入您的规格,它应该会为您提供一些有用的配置设置。

如果我记得我遗漏的任何内容,我会尝试回来编辑这篇文章。否则,如果有任何不合理或不清楚的地方,请发表评论。

【讨论】:

以上是关于为啥我的 Postgres 数据库工作了一段时间,然后重新启动后无法“启动服务器”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有为 Postgres 视图启用行级安全性?

COPY 是如何工作的,为啥它比 INSERT 快得多?

为啥 spring-boot 和 postgres 连接会在一段时间后断开?

Postgres的CREATE UNIQUE INDEX似乎停留了一段时间

使用 ruby​​ on rails 将布尔值保存到 postgres 数据库

为啥 Postgres 不接受我的计数列?