Saya sedang menguji peningkatan PostgreSQL 8.2.1 ke 9.2 pada mesin virtual yang menjalankan distro Linux khusus. Prosedur peningkatan adalah sebagai berikut:
- Mulai
pg
layanan - Vakum semua DB (tidak yakin apakah ini diperlukan)
- Cadangkan dengan
pg_dumpall
- Hentikan
pg
layanan - Pindahkan direktori tempat data disimpan (
/var/pg
; ini adalah pengaturan server tunggal yang sederhana) - Instal PostgreSQL 9.2
initdb
- Mulai server
- Kembalikan data yang dibuang
reindexdb
semua DB- Buat kembali
referential_constraints
pemandangan - Kosongkan semua DB (AFAIK diperlukan setelah peningkatan ini)
Prosedur ini berfungsi dengan baik pada satu host, mencadangkan dan memulihkan tanpa hambatan. Di komputer lain dengan titik basis data yang berbeda 1 hingga 7 berfungsi dengan baik, tetapi server tidak akan memulai kecuali saya menambahkan sleep 1
setelah initdb
, dan bahkan kemudian data yang dibuang tidak dapat dipulihkan karena "sistem basis data mulai". Apa cara standar untuk mengatasi ini, kecuali untuk peretasan yang mengerikan ini:
sleep
untuk sejumlah waktu sebelum operasi,- perulangan sampai berfungsi atau sampai batas waktu yang baik tercapai, atau
- pengulangan sampai menerima kueri sepele atau batas waktu tercapai.
Sunting: " Solusi " tidak berhasil sama sekali. Apa yang diperlukan untuk memastikan database siap menjalankan pemulihan?
postgresql
restore
upgrade
l0b0
sumber
sumber
initdb
status keluar? Saya kira ketika itu mengatur pekerjaan dilakukan.initdb
dijalankan secara serempak, sehingga ketika server dimulaiinitdb
sudah selesai dengan sukses.Jawaban:
initdb tidak kembali sampai selesai, jadi seharusnya tidak ada jeda yang diperlukan antara itu dan startup server. Ada bug di PostgreSQL di mana ia selesai tanpa membuang semua ke disk terlebih dahulu. Saya tidak tahu ada yang tersisa sekarang, tetapi sifat bug adalah bahwa Anda tidak selalu tahu tentang mereka.
Jika Anda menggunakan perintah pg_ctl untuk memulai database, gunakan parameter "-w" untuk menunggu sampai startup selesai sebelum kembali. Itu tidak melakukan sesuatu yang mewah - itu hanya "sudah siap?" lingkaran untuk Anda.
Perhatikan bahwa jika Anda mendapatkan server crash dengan banyak data yang perlu diputar ulang sebelum server dapat mulai, batas waktu yang ditetapkan oleh "-t" pada pg_ctl menunggu mungkin terlalu rendah.
Tidak ada alasan untuk VACUUM database sumber sebelum melakukan pg_dump dari mereka. Meskipun mungkin mempercepat pembuangan sedikit, ruang hampa itu sendiri akan membutuhkan waktu lebih lama dari perbaikan itu.
sumber
pg_restore -j
{morethan1}).postmaster
untuk memulai daemon, dan sepertinya tidak memiliki opsi seperti itu.Itu
kerjasolusi rusak adalah memodifikasi skrip init untuk memeriksa berulang kali apakah port yang relevan sedang digunakan. Jika tidak muncul setelah satu menit, startup dianggap gagal. Kode semu:Sunting: Ternyata ini tidak cukup. Langkah pemulihan:
Pesan eror:
sumber