1

我的软件进程依赖于本地 PostgreSQL 集群中特定数据库的存在。PostgreSQL 和我的软件进程都是在系统启动时由 upstart 启动的。在 PostgreSQL 启动之后和我的软件进程启动之前执行一个脚本,以确保数据库处于正确的状态。

该脚本使用 pg_dump 转储数据库的模式。如果服务器未运行或未准备好连接,我会看到以下内容

$ pg_dump -U postgres -s testdb
pg_dump: [archiver (db)] connection to database "testdb" failed: 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"?

如果数据库不存在,我会看到以下内容

$ pg_dump -U postgres -s testdb
pg_dump: [archiver (db)] connection to database "testdb" failed: FATAL:  database "testdb" does not exist

似乎有一个时间窗口,即使集群确实包含数据库“testdb”,对 pg_dump 的调用也会报告数据库不存在。我可以通过在服务器启动和运行我的脚本之间添加一个短暂的睡眠来避免这个问题。我更喜欢不包括任意时间长度的睡眠的解决方案。有什么建议么?

我在 32 位 Ubuntu 12.04 LTS 上运行 PostgreSQL 9.1。

4

1 回答 1

1

假设这是一个 shell 脚本,我猜你不是在等待 create database 命令完成。您可以在后台运行 createdb n 或在后台运行 psql。如果您在前台运行它们,这不应该发生,因为它们将阻塞直到数据库完成。

于 2013-10-27T02:22:28.580 回答