Korzystam z pg_dump / pg_restore do tworzenia kopii zapasowych i przywracania bazy danych PostgreSQL, ale otrzymuję komunikaty o błędach (i niezerowy status wyjścia) z pg_restore. Wypróbowałem bardzo prostą skrzynkę podstawową (opisaną poniżej), ale nadal otrzymałem te błędy:
pg_restore: [archiwizator (db)] Błąd podczas PRZETWARZANIA Spisu treści: pg_restore: [archiwizator (db)] Błąd z pozycji 5 spisu treści; 2615 2200 SCHEMA publiczne posty pg_restore: [archiwizator (db)] nie mógł wykonać zapytania: BŁĄD: schemat „public” już istnieje Polecenie brzmiało: UTWÓRZ SCHEMAT publiczny;
Kroki ku reprodukcji:
- Zainstaluj świeżą, waniliową dystrybucję Ubuntu 14.04 (używam Vagrant z tym pudełkiem Vagrant ).
- Zainstaluj PostgreSQL 9.3, skonfiguruj, aby zezwalać na połączenia lokalne jako „postgres” użytkownika PostgreSQL od dowolnego użytkownika Linuksa.
Utwórz testową bazę danych. Po prostu robię:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Wpisz „help”, aby uzyskać pomoc. postgres = # stwórz bazę danych mydb; UTWÓRZ BAZA DANYCH postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Wpisz „help”, aby uzyskać pomoc. mydb = # utwórz dane tabeli (wpis bigint); UTWÓRZ TABELĘ mydb = # wstaw do wartości danych (1); WSTAW 0 1 mydb = # wstaw do wartości danych (2); WSTAW 0 1 mydb = # wstaw do wartości danych (3); WSTAW 0 1 mydb = # \ q
Utwórz kopię zapasową bazy danych w następujący sposób:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
Usuń niektóre wiersze z tabeli danych na mydb, abyśmy mogli stwierdzić, czy dane zostały pomyślnie przywrócone.
Przywróć bazę danych za pomocą:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Dane są przywracane, ale polecenie pg_restore w kroku 6 kończy działanie ze statusem 1
i wyświetla następujące dane wyjściowe:
pg_restore: [archiwizator (db)] Błąd podczas PRZETWARZANIA Spisu treści: pg_restore: [archiwizator (db)] Błąd z pozycji 5 spisu treści; 2615 2200 SCHEMA publiczne posty pg_restore: [archiwizator (db)] nie mógł wykonać zapytania: BŁĄD: schemat „public” już istnieje Polecenie brzmiało: UTWÓRZ SCHEMAT publiczny; OSTRZEŻENIE: błędy ignorowane podczas przywracania: 1
Nie mogę tego po prostu zignorować, ponieważ uruchamiam to polecenie programowo i muszę użyć statusu wyjścia, aby ustalić, czy odtwarzanie nie powiodło się. Początkowo zastanawiałem się, czy ten problem nie jest spowodowany tym, że umieściłem publicznie moją bazę danych (domyślny schemat). Uznałem, że publiczność zostanie utworzona w wyniku --create
opcji przez pg_restore, zanim dane zostaną przywrócone (co może również próbować utworzyć ten schemat, ponieważ tam jest moja tabela), ale kiedy wypróbowałem powyższe kroki z moją tabelą w innym schemacie wyniki były takie same, a komunikaty o błędach były identyczne.
czy robię coś źle? Dlaczego widzę ten błąd?
--create
bezclean
nie rozwiązuje problemu.