PostgreSQL 运行了吗?

1 阅读3分钟

PostgreSQL 运行了吗?

摘要: 本文提供了一份在 Linux 上检查 PostgreSQL 是否运行的故障排除指南,包括如何识别正确的实例和端口,以及在基于 Debian 和使用 Systemd 的发行版上启动 Postgres 的方法。

原文链接


我在 Postgres 的 slackTelegram 群组 上,较少出现在 IRC 上。我经常反复看到同样的问题:"Postgres 不能用了,你能帮我吗?"。不,我们帮不了。信息太少了,我们什么也做不了。

因此,我决定为在 Linux 上运行的 Postgres 创建这个小型故障排除指南(对于 Windows,一些技巧可能准确,一些可能不适用)。今天的第一部分:Postgres 运行了吗?

如何检查 Postgres 是否运行?

无论你做什么,你都需要知道 Postgres 是否在运行(或者是否有多个 Postgres 同时运行)。有几种方法可以找出答案,这是我结合了朋友们发给我的好技巧后定制的方法:

pgrep -u postgres -fa -- -D

我应该为昨天甚至不知道 pgrep 的存在而感到羞耻吗?我不这么认为。如果我为自己不知道的一切感到羞耻,我就会害怕学习,而我当然不想那样!

所以 pgrep 会查看进程并尝试在上面执行 grep。这是我添加的选项,让它按我想要的方式查找:

  • -u postgres 只会查看由用户 postgres 拥有的进程
  • -f 会在整个命令行中查找模式,而不仅仅是进程名
  • -a 会显示整个命令行,而不仅仅是进程号
  • -- 会允许以 - 开头的模式(比如我们的 -D

所以,正常情况下你应该看到一行或几行如下:

[root@centos7 vagrant]# pgrep -u postgres -fa -- -D
2424 /usr/pgsql-12/bin/postmaster -D /var/lib/pgsql/12/data/

但如果你有多个实例在运行,你会看到多行如下:

root@ubuntu:/home/vagrant# pgrep -fa -- -D |grep postgres
4499 /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
6378 /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/test -c config_file=/etc/postgresql/12/test/postgresql.conf

如果你有多个 Postgres 同时运行,也许你尝试连接的不是正确的实例?

如果一行都没有,那意味着 Postgres 没有启动。

如何连接到正确的 Postgres 实例

每个 Postgres 实例使用一个端口进行连接。默认情况下,使用 5432 端口。你需要找出每个实例使用的端口,以便连接到正确的那个。

查找 $PGDATA 目录

你很可能会在之前执行的 pgrep 命令中 -D 选项后面指示的路径中找到你的 $PGDATA 目录。所以,在我的情况下,我的 CentOS 主机上的 $PGDATA/var/lib/pgsql/12/data/,而我的 Ubuntu 主机上运行的实例则是 /var/lib/postgresql/12/main/var/lib/postgresql/12/test

查找你的端口

找到你的 $PGDATA 目录后,你会找到一个 postmaster.pid 文件。第 4 行会给出该实例的端口。所以,你可能想尝试那个命令来直接获取你的端口号。

sed -n 4p <$PGDATA>/postmaster.pid

所以,对于我的 CentOS 主机,这个命令将是:

sed -n 4p /var/lib/pgsql/12/data/postmaster.pid

-n 标志将确保我们只获取所要求的行。sed 命令将去除任何注释,grep 命令将查找 port 这个词。4 表示我们想要第 4 行,p 表示我们要打印它。

如何启动 Postgres

同样有几种方法可以启动 Postgres。如果你运行的是基于 Debian 的发行版,你会发现 Perl 包装器非常方便。

对于 Debian 或基于 Debian(包括 Ubuntu)的 Linux 发行版

首先,执行 pg_lsclusters 来找出你的集群名称:

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
12  main    5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

要启动该特定的集群,你只需要执行:

pg_ctlcluster <Version> <Name> start

所以,在我们的例子中,它将是:

pg_ctlcluster 12 main start

对于使用 Systemd 的发行版

如果你的 Linux 发行版使用 Systemd,你也可以使用它。要做到这一点,你需要服务名称。你可以通过执行这个简单的命令来找到它(我假设你的服务已按照 Postgres 下载和安装页面的建议启用):

systemctl list-unit-files | grep enabled | grep postgres

例如,我的 CentOS 回答我:

postgresql-12.service                         enabled

所以,要启动该服务,你只需要执行:

systemctl start postgresql-12

这太简单了!下次,我们将看看当 Postgres 拒绝启动时该怎么办!(是的,这种情况经常发生,大多数时候是因为你搞砸了,但那是另一个故事了)。