PostgreSQL服务器无法启动


14

[Ubuntu 16.04]我安装了postgresql 9.5及其依赖项:

sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-common
sudo apt-get install postgresql-9.5 libpq-dev

当我想跑步时,psql我得到:

psql: 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"?

但是/var/run/postgresql/是空的。当我重新启动posgresql时,一切似乎都很好:

$ /etc/init.d/postgresql restart
[ ok ] Restarting postgresql (via systemctl): postgresql.service.

$ /etc/init.d/postgresql status
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since wto 2016-09-27 16:18:26 CEST; 1min 15s ago
  Process: 3076 ExecReload=/bin/true (code=exited, status=0/SUCCESS)
  Process: 3523 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 3523 (code=exited, status=0/SUCCESS)

但是如果检查ps aux没有这样的PID(为什么?)

重新安装完全没有帮助。我该如何解决?


/var/log/posgtresql/postgresql-9.5-main.log文件显示什么?
ubfan1 16/09/27

该文件为空
mike927

Answers:


14

这是PostgreSQL在Xenial中系统集成的特质。

由postgresql-common软件包安装的postgresql服务单元只是一个虚拟服务,它导致实际服务postgresql@9.6-main通过依赖项启动。您可以通过运行命令来查看该依赖性

systemctl list-dependencies postgresql

该依赖关系不是永久的,而是在系统启动期间由systemd生成器生成的/lib/systemd/system-generators/postgresql-generator,该生成器也随附于postgresql-common软件包。生成器检查文件中的启动模式/etc/postgresql/9.6/main/start.conf是否设置为auto,如果设置为,则设置依赖关系,该依赖关系随后导致实例9.6-main启动。

(更确切地说,它将检查所有配置子目录/etc/postgresql/*/*,并将为配置为自动启动的所有实例创建依赖关系,但在默认安装中,将只有一个实例。)

由于systemd生成器的限制(请参阅参考资料man systemd.generator),该过程可能会失败,从而导致重新启动后缺少相关性。然后,Systemd将启动虚拟服务,编写

systemd[1]: Starting PostgreSQL RDBMS...
systemd[1]: Started PostgreSQL RDBMS.

到日志,但不执行任何操作。尝试通过以下方式手动启动服务

systemctl start postgresql

只会重现该结果。运行命令

systemctl daemon-reload

以root身份手动将重新运行生成器,并且在大多数情况下,请解决该问题,直到下次重新启动为止。

要永久解决该问题,您必须找出启动器生成器失败的原因。可能的原因可以在systemd.generator联机帮助页中找到。在我的情况下,是PostgreSQL配置文件/etc/postgresql/9.6/main/postgresql.conf,该文件被符号链接到一个不同的文件系统,当生成器在启动过程中提前运行时,该文件系统尚不可用。postgresql-generator即使该文件不需要它,也检查该文件的存在。


当您设法解决问题时,请随时编辑您的答案:)
风暴

9

扩展了Tilman的答案,但没有足够的荣誉来评论...

如果您不需要将该服务称为postgresql,并且不关心包装程序虚拟服务,则它应仅用于直接控制实际服务。它的名称是:postgresql@$version-$cluster.service在您的情况下,它的简称应该是postgresql-9.5-main。喜欢开始

systemctl start postgresql@9.5-main

并停止:

systemctl stop postgresql@9.5-main

与自动生成的包装程序服务相比,状态还可以为您提供更好,更准确的信息。

systemctl status postgresql@9.5-main

对于9.6,它看起来像这样:

● postgresql@9.6-main.service - PostgreSQL Cluster 9.6-main
   Loaded: loaded (/lib/systemd/system/postgresql@.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-09-13 00:41:50 CEST; 7h ago
  Process: 10235 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop (code=exited, status=2)
  Process: 10676 ExecStart=postgresql@%i --skip-systemctl-redirect %i start (code=exited, status=0/SUCCESS)
 Main PID: 10683 (postgres)
   CGroup: /system.slice/system-postgresql.slice/postgresql@9.6-main.service
           ├─10683 /usr/lib/postgresql/9.6/bin/postgres -D /var/lib/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf
           ├─10685 postgres: 9.6/main: checkpointer process
           ├─10686 postgres: 9.6/main: writer process
           ├─10748 postgres: 9.6/main: wal writer process
           ├─10749 postgres: 9.6/main: autovacuum launcher process
           ├─10750 postgres: 9.6/main: archiver process   last was 000000020000000000000082
           ├─10751 postgres: 9.6/main: stats collector process

4

就我而言,这与配置错误的语言环境有关。

我已经在dba.stackexchange.com答案中找到了解决方案:

  1. 使用sudo dpkg-reconfigure locales产生必要的语言环境
  2. 通过删除现有数据库集群sudo pg_dropcluster 9.5 main(这将删除集群中的所有数据!)
  3. 通过以下方式重新创建集群 sudo pg_createcluster 9.5 main --start
  4. 通过重启PostgreSQL sudo service postgresql restart

1

最好在ubuntu 16.04上使用systemd启动脚本,这些天启动脚本可能无法正常工作。Postgres 9.5已经存在于ubuntu仓库中,因此请尝试改成,它应该已系统启动。


使用标准的ubuntu回购,我得到相同的结果
mike927

太可惜了,好像Postgres的人们还没有掌握systemd的窍门。您可能应该针对postgres软件包提出一个错误,或者在他们的邮件列表中询问有关systemd支持的信息。我不太使用postgres,但是一些开放源代码项目已经反对systemd的立场,或者在有关支持它的内部辩论中纠结了。
Amias

当我运行systemctl时,它返回“ postgresql@9.5-main.service加载失败PostgreSQL集群9.5-main失败”。为什么失败了?
mike927

在这种情况下,是systemd启动脚本无法正常工作,因此建议并非完全有用。
Tilman

1

另一个“被这个咬了”。

pg_upgradecluster实际上在端口5432留在端口5433和源版本(9.5)“手动”模式的目标版本(9.6)。

甚至以后pg_dropcluster 9.5。编辑start.conf文件无济于事,但提示是使用 systemctl daemon-reload,因为生成器基于此配置文件决定是否对服务文件进行符号链接:

for conf in /etc/postgresql/*/*/postgresql.conf; do
    # trimmed for brevity
    [ "$start" = "auto" ] || continue
    ln -s "$pgservice" "$wantdir/postgresql@$version-$cluster.service"
done

因此,如果要启动的集群在start.conf中没有单词“ auto”,则需要进行系统重新加载(或重新引导)以在引导时启用它。

仍然必须通过重新启动来验证这一点,但是鉴于以上所述,这确实是问题所在。


1

我这样禁用了魔术“超级服务”:

root@server# systemctl disable postgresql

然后,我启动了具体服务:

root@server:~# systemctl enable postgresql@9.5-main.service 

重新启动后,一切都恢复了。


0

遇到同样的错误,浪费时间,简单的解决方案。检查这个SO问题和我的答案,这是:

sudo service postgresql restart

0

由于另一个原因,我遇到了这个问题:目录权限。我有这样一个全扫描的chmod:

chmod -R 644 /etc/postgresql/10/main

这会将目录设置为不可执行,从而阻止postgres读取它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.