Postgresql 服务器无法启动

Postgresql 服务器无法启动

[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(为什么??)

完全重新安装毫无用处。我该如何修复?

答案1

这是 Xenial 中 PostgreSQL 的 systemd 集成的一个特性。

postgresql-common 包安装的 postgresql 服务单元只是一个虚拟服务,它会导致实际服务[电子邮件保护]通过依赖项启动。您可以通过运行命令来查看该依赖项

systemctl list-dependencies postgresql

该依赖项不是永久的,而是由/lib/systemd/system-generators/postgresql-generatorpostgresql-common 包附带的 systemd 生成器在系统启动期间生成的。生成器检查文件中的启动模式是否/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检查该文件是否存在,即使它不需要它。

答案2

扩展 Tilman 的答案,但 Kudos 不足以评论......

如果你不需要将服务命名为 postgresql,也不关心包装器虚拟服务,那么只需直接控制真实服务即可。它的名称是:postgresql@$version-$cluster.service就你的情况来说应该是postgresql-9.5-main简而言之。喜欢开始

systemctl start [email protected]

并停止:

systemctl stop [email protected]

地位也会给你比自动生成的包装服务更好、更准确的信息。

systemctl status [email protected]

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

[email protected] - PostgreSQL Cluster 9.6-main
   Loaded: loaded (/lib/systemd/system/[email protected]; 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/[email protected]
           ├─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

答案3

就我而言,这与错误配置的区域设置有关。

我找到了解决方案在 dba.stackexchange.com 的回答中

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

答案4

最好在 ubuntu 16.04 中使用 systemd 启动脚本,因为 init 脚本现在可能无法正常工作。Postgres 9.5 已经在 ubuntu 存储库中,因此请尝试使用它,它应该具有 systemd 启动。

相关内容