在初始化脚本中,我想初始化一个PostgreSQL目录,但在此阶段不需要(也不希望)运行PostgreSQL服务器。如果我只是创建群集(作为用户postgres),那么这将是一件轻而易举的事情:
特别是等待PostgreSQL服务器的部分从来不是100%可靠的。我尝试了很多变体,每个变体大约有1/20的失败率。此外,在简单的shell脚本中杀死该进程可能不是100%可靠的,更不用说确保它已正确停止了。
我相信这是在引导服务器或准备VM映像的所有用例中都会出现的标准问题。因此,人们希望在2016年应该存在某些现有的、可靠的工具。所以我的问题是:
initdb -D ...
但是,我还需要创建PostgreSQL角色、创建数据库并添加一些扩展(也必须作为用户postgres
):
createuser someuser
createdb -O someuser somedb
echo 'CREATE EXTENSION xyz;' | psql somedb
后面的命令需要运行PostgreSQL服务器。因此,整个过程变得非常混乱:
initdb -D ...
# Start PostgreSQL server in background
... &
# Wait in a loop until PostgreSQL server is up and running
while ! psql -f /dev/null template1; do
sleep 0.5
done
createuser someuser
createdb -O someuser somedb
echo 'CREATE EXTENSION xyz;' | psql somedb
# Kill PostgreSQL server
kill ...
# Wait until the process is really killed
sleep 2
特别是等待PostgreSQL服务器的部分从来不是100%可靠的。我尝试了很多变体,每个变体大约有1/20的失败率。此外,在简单的shell脚本中杀死该进程可能不是100%可靠的,更不用说确保它已正确停止了。
我相信这是在引导服务器或准备VM映像的所有用例中都会出现的标准问题。因此,人们希望在2016年应该存在某些现有的、可靠的工具。所以我的问题是:
- 有没有更简单、更可靠的方法实现这一点?
- 例如,是否有一种运行PostgreSQL服务器的特殊模式,只需启动,执行某些SQL命令,然后在最后一个SQL命令完成后立即退出?
- 粗略地说,是否有一些内部PostgreSQL测试套件可以重用于此目的?
postgres --single
- 一次使用postgres
数据库,然后再使用已创建的数据库。 - vogdbname
只是一个例子。我会更新答案以提供更多的清晰度。 - Laurenz Albe