为什么 PostgreSQL 9.3 不能在 Ubuntu 上启动?

DPS*_*ial 13 postgresql postgresql-9.3

我已经在运行 Ubuntu 12.04 和 13.04 的 2 个虚拟机上从 APT 存储库成功安装了 PostgreSQL 9.3……但是,我无法在运行 Ubuntu 12.04 的主机上正确安装它。

安装(这次)似乎没问题,但也许有一个我不明白的错误:

* No PostgreSQL clusters exist; see "man pg_createcluster"
Setting up postgresql-9.3 (9.3.0-2.pgdg12.4+1) ...
Creating new cluster 9.3/main ...
  config /etc/postgresql/9.3/main
  data   /var/lib/postgresql/9.3/main
  locale en_US.UTF-8
  port   5432
update-alternatives: using /usr/share/postgresql/9.3/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode.
Run Code Online (Sandbox Code Playgroud)

所以我然后尝试将自己添加为 PostgreSQL 用户,但我得到了这个:

createuser: could not connect to database postgres: 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"?
Run Code Online (Sandbox Code Playgroud)

我在系统监视器中看不到 PostgreSQL 正在运行,并且 /var/run/postgresql/ 文件夹中没有文件......完全是空的。

编辑:在 VM 上,/var/run/postgresql/ 中有一个名为 9.3-main.pid 的文件

位于 /var/log/postgresql 的主机日志文件上没有任何内容

那么......这里发生了什么而不是在我的虚拟机中发生?就像我说的,VM 上的其他安装,包括 PostGIS 和 PGAdmin 都很完美……不知道为什么这台主机没有通过……

小智 16

安装 PostgreSQL 时,我的语言环境设置未正确配置。清除和重新安装没有帮助。我按照这里的说明进行操作,这对我有用。

链接信息的基本部分转载如下:

问题表现为以下方式:

warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
...
are supported and installed on your system.
Run Code Online (Sandbox Code Playgroud)

第一个很容易通过执行来解决:

#dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

...并选择首选语言环境。

但在那之后 PostgreSQL 仍然拒绝启动。这是因为安装过程试图在安装时创建集群,但由于区域设置不正确,这并没有完成。所以我们必须通过执行来重做这一步:

#pg_createcluster 9.3 main --start
Run Code Online (Sandbox Code Playgroud)

(针对 9.3 版本的 PostgreSQL)

在这一步之后 PostgreSQL 通过以下方式完美启动

#/etc/init.d/postgresql start
Run Code Online (Sandbox Code Playgroud)

  • 救了我。即使区域设置得到纠正,清除和重新安装也无济于事,这真的很糟糕。这浪费了我生命中的两个小时:( (2认同)

tdg*_*dg5 6

希望您已经解决了这个问题,但我遇到了一个似乎有不同来源的类似问题,如果您仍然遇到问题,也许我的经验会有所帮助。

我在 Ubuntu 上的 9.3 问题与套接字目录是 /run 中的临时目录有关。基本上,init.d 脚本应该负责在 /run/postgresql 中创建套接字目录,如果它在启动操作期间不存在。这将始终是重新启动后的状态。

然而,问题是,如果套接字目录不存在,init.d 脚本将在执行启动操作之前退出。这是因为对 pg_lsclusters 的调用将在没有套接字目录的情况下失败,这反过来又会阻止启动操作创建套接字目录。

我还没有想出最好的解决方案是什么,但是如果我将创建套接字目录的逻辑从启动操作重新定位到调用 pg_lsclusters 之前,我就可以在重新启动后毫无问题地启动服务器。

这是处理创建套接字目录的 start 操作的一部分:

# create socket directory
if [ -d /var/run/postgresql ]; then
  chmod 2775 /var/run/postgresql
else
  install -d -m 2775 -o postgres -g postgres /var/run/postgresql
  [ -x /sbin/restorecon ] && restorecon -R /var/run/postgresql || true
fi
Run Code Online (Sandbox Code Playgroud)

如果我清楚其根本原因,我会发布更新,因为这显然不是预期的行为。

附录:

我认为我遇到这个问题的原因是我没有为unix_socket_directories配置好的值。在 9.2 上,此配置选项曾经是 unix_socket_directory,我将其删除而不是切换到 unix_socket_directories。因为我为 unix_socket_directories 设置了一个值,所以我在服务器启动时没有遇到任何问题。

  • @mapBaker - 我更新了我的回复,包括在我的特定情况下 PG 9.3 启动问题的根本原因。也许它对你也有帮助。 (3认同)