关于ubuntu for Django web应用程序的Postgresql 9.3错误:cluster_port_ready:找不到psql二进制文件

Postgresql 9.3 on ubuntu for Django web application Error: cluster_port_ready: could not find psql binary

我在ubuntu 14.04.5上运行postgresql 9.3时遇到了一些问题

我有一个使用NGINX / Gunicorn运行的django web应用程序,持续了几个星期,然后有一天我去使用它并且我得到了一个OperationalError:

1
2
IS the server running ON host"localhost" (::1) AND accepting
    TCP/IP connections ON port 5432?

经过研究,很明显postgresql服务器没有运行。然后我尝试启动它,并得到以下错误:

1
* No PostgreSQL clusters exist; see"man pg_createcluster"

警报,但我的数据备份很好,所以我做了:

1
pg_createcluster 9.3 main --start

然后我得到了:

1
Error: cluster configuration already EXISTS

没问题。我会放弃并创建一个新的,我想:

1
pg_dropcluster 9.3 main --stop

跑得很好,所以我跑了:

1
pg_createcluster 9.3 main --start

再次,现在它显然创建了集群,但不会启动:

1
2
3
4
5
6
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
Error: cluster_port_ready: could NOT find psql BINARY

有没有人对如何解决这个问题有任何建议?我已经为postgresql做了apt-get remove和install,但结果仍然相同。

提前致谢!

更新:

所以,我尝试了下面的建议来运行以下内容:

1
/usr/lib/postgresql/9.3/bin/initdb -D /var/lib/postgresql/DATA -W -A md5

返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
The files belonging TO this DATABASE system will be owned BY USER"postgres".
This USER must also own the server process.

The DATABASE cluster will be initialized WITH locale"C".
The DEFAULT DATABASE encoding has accordingly been SET TO"SQL_ASCII".
The DEFAULT text SEARCH configuration will be SET TO"english".

DATA page checksums are disabled.

fixing permissions ON existing directory /var/lib/postgresql/DATA ... ok
creating subdirectories ... ok
selecting DEFAULT max_connections ... 100
selecting DEFAULT shared_buffers ... 128MB
creating configuration files ... ok
creating template1 DATABASE IN /var/lib/postgresql/DATA/base/1 ... ok
initializing pg_authid ... ok
Enter NEW superuser password:
Enter it again:
setting password ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/data
or
    /usr/lib/postgresql/9.3/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start

所以我跑了:

1
2
USER$ /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgres
ql/DATA

得到了:

1
2
3
4
5
6
LOG:  could NOT bind IPv6 socket: Address already IN USE
HINT:  IS another postmaster already running ON port 5432? IF NOT, wait a few seconds AND retry.
LOG:  could NOT bind IPv4 socket: Address already IN USE
HINT:  IS another postmaster already running ON port 5432? IF NOT, wait a few seconds AND retry.
WARNING:  could NOT CREATE listen socket FOR"localhost"
FATAL:  could NOT CREATE any TCP/IP sockets


所以我无法恢复我试图运行的postgres实例,所以我使用了这个堆栈溢出文章
如何清除和彻底卸载postgres
。至于为什么会这样,我仍然不知所措。我读到我的问题可能是由LANGUAGE的语言环境变量和LANG_ALL引起的。或者这可能是在更新后引起的,因为我最初运行apt-get时没有指定我想要安装的postgres版本。无论如何,这是我运行的命令让我重新开始工作:

1
apt-GET --purge remove postgresql\*

在这个命令之后,我得到一些错误再次抱怨无效的数据目录,所以根据上面链接中没有标记为答案的帖子的建议,我还运行:

1
apt-GET autoremove postgresql*

这看起来很顺利,所以我回到了接受答案所规定的指示:

1
2
3
4
5
rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

这似乎完成没有错误,除了postgres用户已被先前的命令删除..

然后我根据一篇标题为"解决"找不到PostgresSQL集群"错误的相关文章确保设置了我的语言环境变量
我跑了:
#dpkg-reconfigure locales

一旦完成,我进行了全新安装,这次指定版本号:

1
apt-GET install postgresql-9.3 postgresql-contrib-9.3 postgresql-doc-9.3

安装完成后postgres自动启动,现在似乎没问题了。


创建postgresql数据库集群:

1
2
3
4
5
6
$ sudo su
# mkdir /var/lib/postgresql/DATA
# chown -R postgres:postgres /var/lib/postgresql/DATA

# su postgres
$ /usr/lib/postgresql/9.3/bin/initdb -D /var/lib/postgresql/DATA -W -A md5

如果出现此错误消息:

1
LOG:  could NOT bind IPv4 socket: Address already IN USE

这意味着postgresql已经运行,你需要重启它。

您可以使用以下命令在ubuntu 14.04中重新启动service postgresql:

1
$ sudo sh /etc/init.d/postgresql restart

在使用systemd的新Ubuntu中,使用以下命令重新启动postgresql:

1
$ sudo systemctl restart postgresql