初期化スクリプトでは、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テストスイートからこの目的のために再利用できるものがありますか?
感謝を!シングルユーザーモードは欠けていたヒントでした。しかし、あなたのサンプルコードには欠陥があります。作成前にデータベースにアクセスしようとします。 'postgres --single'は' postgres'データベースで1回、次に作成されたデータベースで2回実行する必要があります。 – vog
もちろん。 'dbname'は単なる例でした。答えをもっと明確にするように更新します。 –