В сценарии инициализации я хочу инициализировать каталог PostgreSQL, но на данном этапе не нужен (и не хочу) работающий сервер PostgreSQL.Как инициализировать базу данных PostgreSQL без запуска сервера PostgreSQL
Это не было бы никакой опасности, если я просто создать кластер (как пользователь postgres
):
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 прогонов. Кроме того, убийство этого процесса не может быть на 100% надежным в простом сценарии оболочки, не говоря уже о том, что он остановился правильно.
Я считаю, что это стандартная проблема, которая возникает во всех случаях использования, связанных с загрузкой сервера или подготовкой образа виртуальной машины. Поэтому можно было бы ожидать, что в 2016 году для этого должны быть некоторые существующие, реальные инструменты. Итак, мои вопросы:
- Есть ли более простой и надежный способ достичь этого?
- Например, есть ли способ запустить сервер PostgreSQL в каком-то специальном режиме, где только запускается, выполняет определенные команды SQL и завершается сразу после завершения последней команды SQL?
- Как грубая идея, есть ли что-то из внутреннего набора тестов PostgreSQL для этой цели?
Спасибо! Однопользовательский режим - отсутствующий намек. Однако ваш примерный код немного испорчен. Он пытается получить доступ к базе данных до ее создания. Кажется, что 'postgres --single' нужно выполнить дважды - один раз с базой данных postgres', а затем с созданной базой данных. – vog
Конечно. 'dbname' был всего лишь примером. Я уточню ответ для большей ясности. –