2016-10-14 14 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%信頼できません。私はたくさんの変種を試してみましたが、それぞれ20回におよそ1回失敗しました。また、そのプロセスを強制終了することは、単純なシェルスクリプトでは100%信頼できるものではなく、正しく停止したことを保証するものではありません。

これは、サーバーのブートストラップやVMイメージの準備に関するすべての使用例で発生する標準的な問題だと思います。だから、2016年には、そのための既存の、現実的なツールがあるはずです。だから私の質問は:

  • これを達成するためのより簡単で信頼性の高い方法はありますか?
  • たとえば、特定のSQLコマンドを実行し、最後のSQLコマンドが終了した直後に起動する、特別なモードでPostgreSQLサーバを実行する方法はありますか?
  • 大まかな考えとして、内部目的の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'データベースで1回、次に作成されたデータベースで2回実行する必要があります。 – vog

+0

もちろん。 'dbname'は単なる例でした。答えをもっと明確にするように更新します。 –

関連する問題