カスタムLinuxディストリビューションを実行している仮想マシンでPostgreSQL 8.2.1から9.2へのアップグレードをテストしています。アップグレード手順は次のとおりです。
pg
サービスを開始しますpg_dumpall
でバックアップpg
サービスを停止します/var/pg
;これはシンプルな単一サーバーのセットアップです)initdb
reindexdb
すべてのDBreferential_constraints
ビューを再作成しますこの手順は、1つのホストで問題なく動作し、問題なくバックアップおよび復元できます。異なるデータベースポイント1から7を持つ別のマシンでは正常に動作しますが、initdb
の後にsleep 1
を追加しない限りサーバーは起動しません。 「データベースシステムが起動しています」。これらのひどいハックを除いて、これに対処する標準的な方法は何ですか?
sleep
ingは、いずれかの操作の前にある程度の時間をかけてください。編集: " solution "は結局機能しませんでした。 データベースが復元を実行する準備ができていることを確認するために何が必要ですか?
initdbは終了するまで戻りません。そのため、initdbとサーバーの起動の間に一時停止は必要ありません。 PostgreSQLにはバグがあり、最初にすべてをディスクにフラッシュせずに完了しました。私は今のところ左については知りませんが、バグの性質はあなたがそれらについて常に知っているわけではないということです。
pg_ctl コマンドを使用してデータベースを起動する場合は、「-w」パラメーターを使用して、起動が完了するまで待機してから戻ります。特別なことは何もしません。「まだ準備ができていますか?」あなたのためのループ。
サーバーが起動する前に再生する必要のある大量のデータでサーバークラッシュが発生した場合、pg_ctlの待機中に "-t"で設定されたタイムアウトが小さすぎる可能性があることに注意してください。
ソースデータベースのpg_dumpを実行する前に、ソースデータベースをVACUUMする理由はありません。ダンプが少し速くなるかもしれませんが、バキューム自体はその改善よりも時間がかかります。
の ワーキング 壊れたソリューションは、関連するポートが使用されているかどうかを繰り返し確認するようにinitスクリプトを変更することでした。 1分経っても表示されない場合は、起動に失敗したと見なされます。疑似コード:
start() {
pg start
checks=0
while checks < 30:
return true if the port is in use
sleep 2
checks++
return false
}
編集:これはnotで十分であることがわかります。復元手順:
PGOPTIONS='--client-min-messages=warning' psql \
--no-psqlrc \
--variable=ON_ERROR_STOP=1 \
--quiet \
--log-file="$restore_log" \
--single-transaction \
--username postgres \
--file="$sql_backup"
エラーメッセージ:
psql: FATAL: the database system is starting up