Saya menggunakan pg_dump / pg_restore untuk mem-backup dan mengembalikan database PostgreSQL, tetapi saya mendapatkan beberapa pesan kesalahan (dan status keluar yang tidak nol) dari pg_restore. Saya mencoba kasus dasar super sederhana (diuraikan di bawah) tetapi masih mendapat kesalahan ini:
pg_restore: [archiver (db)] Kesalahan saat MEMPROSES TOC: pg_restore: [archiver (db)] Kesalahan dari entri TOC 5; 2615 2200 SCHEMA postgres publik pg_restore: [archiver (db)] tidak dapat menjalankan query: ERROR: schema "public" sudah ada Perintah adalah: CREATE SCHEMA public;
Langkah-langkah mereproduksi:
- Instal distro vanilla Ubuntu 14.04 yang baru (saya menggunakan Vagrant dengan kotak Vagrant ini ).
- Instal PostgreSQL 9.3, konfigurasikan untuk memungkinkan koneksi lokal sebagai "postgres" pengguna PostgreSQL dari setiap pengguna Linux.
Buat database uji. Saya hanya melakukan:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Ketik "bantuan" untuk bantuan. postgres = # buat database mydb; BUAT DATABASE postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Ketik "bantuan" untuk bantuan. mydb = # buat data tabel (entri bigint); BUAT TABEL mydb = # masukkan ke dalam nilai data (1); INSERT 0 1 mydb = # masukkan ke dalam nilai data (2); INSERT 0 1 mydb = # masukkan ke dalam nilai data (3); INSERT 0 1 mydb = # \ q
Buat cadangan dari database seperti:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
Hapus beberapa baris dari tabel data di mydb sehingga kami dapat mengetahui apakah kami berhasil memulihkan data.
Pulihkan database dengan:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Data dipulihkan, tetapi perintah pg_restore di langkah 6 keluar dengan status 1
dan menampilkan output berikut:
pg_restore: [archiver (db)] Kesalahan saat MEMPROSES TOC: pg_restore: [archiver (db)] Kesalahan dari entri TOC 5; 2615 2200 SCHEMA postgres publik pg_restore: [archiver (db)] tidak dapat menjalankan query: ERROR: schema "public" sudah ada Perintah adalah: CREATE SCHEMA public; PERINGATAN: kesalahan diabaikan pada pemulihan: 1
Saya tidak bisa mengabaikan ini karena saya menjalankan perintah ini secara terprogram dan perlu menggunakan status keluar untuk menentukan apakah pemulihan gagal atau tidak. Awalnya, saya bertanya-tanya apakah masalah ini karena saya meletakkan database saya di depan umum (skema default). Saya beralasan bahwa publik akan dibuat sebagai hasil dari --create
opsi oleh pg_restore sebelum data dipulihkan (yang mungkin bisa mencoba membuat skema itu juga karena di situlah meja saya berada), tetapi ketika saya mencoba langkah-langkah di atas dengan meja saya dalam skema yang berbeda, hasilnya sama dan pesan kesalahannya sama.
Apakah saya melakukan sesuatu yang salah? Mengapa saya melihat kesalahan ini?
sumber
--create
tanpaclean
tidak memperbaiki masalah.Dalam kasus saya, alasannya adalah bahwa saya menggunakan
pg_restore
dari postgresql-contrib versi 11.2 untuk mengembalikan dump yang dibuat olehpg_dump
9.6 ke cluster PostgreSQL 9.6.Setelah saya menurunkan
pg_restore
punggung saya menjadi 9,6,schema "public" already exists
kesalahan ini hilang, dan proses pemulihan bekerja seperti sebelumnya.sumber