1

私のソフトウェア プロセスは、ローカル PostgreSQL クラスタ内の特定のデータベースの存在に依存しています。PostgreSQL と私のソフトウェア プロセスはどちらも、システムの起動時に upstart によって開始されます。データベースが正しい状態にあることを確認するために、PostgreSQL の起動後、ソフトウェア プロセスの開始前にスクリプトが実行されます。

このスクリプトは、pg_dump を使用してデータベースのスキーマをダンプします。サーバーが実行されていないか、接続の準備ができていない場合、次のように表示されます

$ pg_dump -U postgres -s testdb
pg_dump: [archiver (db)] connection to database "testdb" failed: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

データベースが存在しない場合、次のように表示されます

$ pg_dump -U postgres -s testdb
pg_dump: [archiver (db)] connection to database "testdb" failed: FATAL:  database "testdb" does not exist

クラスタにデータベース 'testdb' が含まれていても、pg_dump の呼び出しでデータベースが存在しないと報告されるタイム ウィンドウがあるようです。サーバーの起動とスクリプトの実行の間に短いスリープを追加することで、この問題を回避できます。任意の時間のスリープを含まないソリューションを希望します。助言がありますか?

32 ビット Ubuntu 12.04 LTS で PostgreSQL 9.1 を実行しています。

4

1 に答える 1

1

これがシェル スクリプトであると仮定すると、データベース作成コマンドが完了するのを待っているわけではないと思います。バックグラウンドで createdb n または psql を実行している可能性があります。これらをフォアグラウンドで実行すると、データベースが完了するまでブロックされるため、これは発生しません。

于 2013-10-27T02:22:28.580 に答える