2016-10-14 3 views
2

В сценарии инициализации я хочу инициализировать каталог 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 для этой цели?

ответ

5

Вы ищете single-user mode.

Если вы начинаете PostgreSQL, то это сеанс, связанный как суперпользователь, ожидающий операторов SQL на стандартном входе. Как только вы отключитесь (с конечным файлом), серверный процесс будет остановлен.

Так что вы можете сделать это следующим образом (с bash):

postgres --single -D /usr/local/pgsql/data postgres <<-"EOF" 
CREATE USER ...; 
CREATE DATABASE somedb ...; 
EOF 

postgres --single -D /usr/local/pgsql/data somedb <<-"EOF" 
CREATE EXTENSION ...; 
EOF 
+0

Спасибо! Однопользовательский режим - отсутствующий намек. Однако ваш примерный код немного испорчен. Он пытается получить доступ к базе данных до ее создания. Кажется, что 'postgres --single' нужно выполнить дважды - один раз с базой данных postgres', а затем с созданной базой данных. – vog

+0

Конечно. 'dbname' был всего лишь примером. Я уточню ответ для большей ясности. –

Смежные вопросы