pg_restore: [archiver (db)] sorgu yürütülemedi: HATA: “genel” şeması zaten var


19

PostgreSQL veritabanını yedeklemek ve geri yüklemek için pg_dump / pg_restore kullanıyorum, ancak pg_restore'dan bazı hata mesajları (ve sıfır olmayan bir çıkış durumu) alıyorum. (Aşağıda özetlenen) süper basit bir temel durum denedim ama yine de bu hataları aldım:

pg_restore: [archiver (db)] TOC İŞLENİRKEN hata:
pg_restore: [archiver (db)] İçindekiler 5 girişinden hata; 2615 2200 SCHEMA halka açık postgres
pg_restore: [archiver (db)] sorgu yürütülemedi: HATA: "genel" şeması zaten var
    Komut şuydu: SCHEMA'yı CREATE public;

Yeniden oluşturma adımları:

  1. Taze, vanilya Ubuntu 14.04 dağıtımını kurun (Vagrant'ı bu Vagrant kutusuyla kullanıyorum ).
  2. PostgreSQL 9.3'ü kurun, herhangi bir Linux kullanıcısından PostgreSQL kullanıcısı "postgres" olarak yerel bağlantılara izin verecek şekilde yapılandırın.
  3. Bir test veritabanı oluşturun. Sadece yapıyorum:

    vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql - kullanıcı adı = postgres postgres
    psql (9.3.5)
    Yardım için "yardım" yazın.
    
    postgres = # veritabanı oluştur mydb;
    VERİTABANI YARAT
    postgres = # \ q
    vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql - kullanıcı adı = postgres mydb
    psql (9.3.5)
    Yardım için "yardım" yazın.
    
    mydb = # tablo verisi oluştur (bigint girişi);
    TABLO OLUŞTUR
    mydb = # veri değerlerine ekleme (1);
    INSERT 0 1
    mydb = # veri değerlerine ekleme (2);
    INSERT 0 1
    mydb = # veri değerlerine ekleme (3);
    INSERT 0 1
    mydb = # \ q
    
  4. Veritabanının böyle bir yedeğini oluşturun:

    PGPASSWORD = "postgres" pg_dump --dbname = mydb - kullanıcı adı = postgres --format = özel> pg_backup.dump
  5. Mydb'deki veri tablosundan bazı satırları silin, böylece verileri başarıyla geri yükleyip yüklemediğimizi söyleyebiliriz.

  6. Veritabanını şununla geri yükle:

    PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres - kullanıcı adı = postgres pg_backup.dump

Veriler geri yüklenir, ancak 6. adımdaki pg_restore komutu durumdan çıkar 1ve aşağıdaki çıktıyı gösterir:

pg_restore: [archiver (db)] TOC İŞLENİRKEN hata:
pg_restore: [archiver (db)] İçindekiler 5 girişinden hata; 2615 2200 SCHEMA halka açık postgres
pg_restore: [archiver (db)] sorgu yürütülemedi: HATA: "genel" şeması zaten var
    Komut şuydu: SCHEMA'yı CREATE public;



UYARI: geri yükleme sırasında göz ardı edilen hatalar: 1

Bunu görmezden gelemem çünkü bu komutu programlı olarak çalıştırıyorum ve geri yükleme işleminin başarısız olup olmadığını belirlemek için çıkış durumunu kullanmanız gerekiyor. Başlangıçta, bu sorunun veritabanımı genel (varsayılan şema) koymak nedeniyle olduğunu merak ettim. Ben --createveri geri yüklenmeden önce pg_restore tarafından seçeneğin bir sonucu olarak yaratıldığını düşündüm (bu benim masamın olduğu yer olduğu için bu şemayı da oluşturmayı deneyebilir), ancak yukarıdaki adımları masamla denediğimde farklı bir şemada, sonuçlar aynıydı ve hata mesajları aynıydı.

Yanlış bir şey mi yapıyorum? Neden bu hatayı görüyorum?

Yanıtlar:


16

Hata zararsızdır, ancak ondan kurtulmak için, bu geri yüklemeyi iki komuta ayırmanız gerektiğini düşünüyorum:

dropdb -U postgres mydb && \
 pg_restore --create --dbname=postgres --username=postgres pg_backup.dump

--cleanPg_restore seçeneğini çok benziyor ama aslında önemsiz olmayan sorunları gündeme gelmez.

9.1'e kadar olan sürümler için

Pg_restore seçeneklerinin --createve --cleanpg_restore seçeneklerinin birleşimi, eski PG sürümlerinde (9.1'e kadar) bir hataydı. Gerçekten arasında bazı çelişkiler vardır (9.1 man sayfasını alıntılamak):

--clean Veritabanı nesnelerini yeniden oluşturmadan önce temizleyin (bırakın)

ve

--create Veritabanını geri yüklemeden önce oluşturun.

Çünkü yepyeni bir veritabanında temizlik yapmanın anlamı nedir?

9.2 sürümünden itibaren

Kombinasyon şimdi kabul edildi ve doktor bunu söylüyor (9.3 man sayfasını alıntılayarak):

--clean Veritabanı nesnelerini yeniden oluşturmadan önce temizleyin (bırakın). (Hedef veritabanında herhangi bir nesne yoksa, bu bazı zararsız hata iletileri oluşturabilir.)

--create Veritabanını geri yüklemeden önce oluşturun. --Clean ayrıca belirtilirse, hedef veritabanını bağlamadan önce bırakın ve yeniden oluşturun.

Şimdi her ikinizin de birlikte olması, geri yüklemeniz sırasında bu tür bir sıralamaya yol açar:

DROP DATABASE mydb;
...
CREATE DATABASE mydb WITH TEMPLATE = template0... [other options]
...
CREATE SCHEMA public;
...
CREATE TABLE...

DROPHer bir nesne için hayır , sadece DROP DATABASEbaşlangıçta bir yok. Eğer bunu kullanmazsanız --createtam tersi olur.

Neyse bu dizi hatasını yükseltir publicoluşturarak çünkü zaten var olan şema mydbgelen template0zaten ithal etmiştir (normal olan bir şablon veritabanının nokta).

Bu davanın neden otomatik olarak ele alındığından emin değilim pg_restore. Belki de, bir yönetici bunu yapmamamız gerekse bile template0, amacını özelleştirmeye ve / veya amacını değiştirmeye karar verdiğinde istenmeyen yan etkilere neden olabilir public.


9.6 kullanıyorum ve --createolmadan belirtmek cleansorunu çözmez.
Cerin

7

Benim durumumda, ben pg_restorepostgresql-katkıda sürüm 11.2 pg_dump9.6 tarafından bir PostgreSQL küme 9.6 yapılan bir dökümü geri yüklemek için kullanmak oldu .

Sırtımı pg_restore9.6'ya düşürdükten sonra bu schema "public" already existshata gitti ve geri yükleme işlemi daha önce olduğu gibi çalıştı.


Ama pg_restore 9.6'yı kullanarak dökümü bir postgres 11.2 veritabanına geri yüklediniz mi?
Mariano Ruiz

@MarianoRuiz Orijinal cevabımın açık olduğunu düşünüyorum: "pg_dump 9.6 tarafından PostgreSQL kümesine 9.6 yapılan bir dökümü geri yüklemek için postgresql-antrenman 11.2 sürümünden pg_restore kullanıyordum." Yani sorunuza: Hayır, yapmadım. Pg_restore'um 11.2 iken pg kümesi 9.6
Lu Liu

0

Ben çözdüm:

içinde db.sqldosyanın

drop database if exists DB_name;
create database DB_name;
drop schema if exists public;
create schema public;
\q

sonra

PGPASSWOD=DB_pass psql -U DB_user -h 127.0.0.1 < db.sql

Ve sonra

PGPASSWOD=DB_pass pg_restore -h 127.0.0.1 \ 
    -U DB_user -d DB_name --create --no-acl --no-owner DB_dump_FILE

Pg_restore sürümüm 11.6

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.