[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-generator
postgresql-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 的回答中:
- 用于
sudo dpkg-reconfigure locales
生成必要的语言环境 - 删除现有的数据库集群
sudo pg_dropcluster 9.5 main
(这将删除集群中的所有数据!) - 通过以下方式重新创建集群
sudo pg_createcluster 9.5 main --start
- 通过以下方式重启 PostgreSQL
sudo service postgresql restart
答案4
最好在 ubuntu 16.04 中使用 systemd 启动脚本,因为 init 脚本现在可能无法正常工作。Postgres 9.5 已经在 ubuntu 存储库中,因此请尝试使用它,它应该具有 systemd 启动。