如何等待 PostgreSQL 可启动/可恢复?

l0b*_*0b0 8 postgresql upgrade restore

我正在运行自定义 Linux 发行版的虚拟机上测试从 PostgreSQL 8.2.1 到 9.2 的升级。升级过程如下:

  1. 启动pg服务
  2. 清空所有数据库(不确定是否需要)
  3. 备份与 pg_dumpall
  4. 停止pg服务
  5. 移开存储数据的目录(/var/pg;这是一个简单的单服务器设置)
  6. 安装 PostgreSQL 9.2
  7. initdb
  8. 启动服务器
  9. 恢复转储的数据
  10. reindexdb 所有数据库
  11. 重新创建referential_constraints视图
  12. 清空所有数据库(此升级后需要 AFAIK)

此过程在一台主机上运行良好,备份和恢复顺利。在另一台具有不同数据库点 1 到 7 的机器上工作正常,但服务器不会启动,除非我添加sleep 1after initdb,即使这样,转储的数据也无法恢复,因为“数据库系统正在启动”。处理这个问题的标准方法是什么,除了这些可怕的黑客:

  1. sleep在任一操作之前花一些时间,
  2. 循环直到它工作或直到达到慷慨的超时,或
  3. 循环直到它接受一个简单的查询或达到超时。

编辑:“解决方案”毕竟不起作用。如何确保数据库准备好运行还原?

Gre*_*ith 5

initdb 在完成之前不会返回,因此在它和服务器启动之间不应该有任何暂停。PostgreSQL 中存在一些错误,它在没有先将所有内容刷新到磁盘的情况下完成。我现在不知道还有什么,但 bug 的本质是你并不总是知道它们。

如果使用pg_ctl命令启动数据库,请使用“-w”参数等待启动完成后再返回。它没有做任何花哨的事情——它只是“准备好了吗?” 为你循环。

请注意,如果您的服务器崩溃并需要在服务器启动之前重放大量数据,则 pg_ctl 等待时由“-t”设置的超时可能太低。

在对源数据库进行 pg_dump 之前没有理由对它们进行 VACUUM。虽然它可能会加快转储速度,但真空本身需要的时间比这种改进要长。