我正在运行自定义Linux发行版的虚拟机上测试将PostgreSQL 8.2.1升级到9.2。升级过程如下:
- 启动
pg
服务 - 清理所有数据库(不确定是否需要这样做)
- 备份
pg_dumpall
- 停止
pg
服务 - 移出存储数据的目录(
/var/pg
;这是一个简单的单服务器设置) - 安装PostgreSQL 9.2
initdb
- 启动服务器
- 恢复转储的数据
reindexdb
所有数据库- 重新创建
referential_constraints
视图 - 清理所有数据库(此升级后需要AFAIK)
此过程在一台主机上正常运行,可以毫无问题地进行备份和还原。在另一台具有不同数据库的机器上,从1到7的点可以正常工作,但是除非添加sleep 1
after initdb
,否则服务器将无法启动,即使那样,由于“数据库系统正在启动”,因此无法还原转储的数据。除了这些可怕的骇客之外,有什么标准的方法可以解决此问题:
sleep
在进行任何一项操作之前要花一些时间,- 循环播放,直到它起作用或达到足够的超时,或者
- 循环直到它接受一个琐碎的查询或达到超时。
编辑:“ 解决方案 ”根本没有用。如何确定数据库已准备好运行还原?
@dezso Nope
—
l0b0 2012年
initdb
是同步运行的,因此启动服务器时initdb
已成功完成。
然后,我没有比循环测试内容是否就绪的简单测试更好的主意了。
—
dezso 2012年
2)不需要。10)也不需要,因为还原转储将重新创建所有索引。
—
a_horse_with_no_name 2012年
initdb
退出状态吗?我想设置完成后就可以了。