Я використовую pg_dump / pg_restore для резервного копіювання та відновлення бази даних PostgreSQL, але я отримую деякі повідомлення про помилки (і ненульовий статус виходу) з pg_restore. Я спробував надзвичайно простий базовий випадок (викладений нижче), але все-таки отримав ці помилки:
pg_restore: [архіватор (db)] Помилка під час обробки TOC: pg_restore: [архіватор (db)] Помилка під час запису TOC 5; 2615 2200 SCHEMA public postgres pg_restore: [архіватор (db)] не зміг виконати запит: ПОМИЛКА: схема "public" вже існує Командою були: СТВОРИТИ СХЕМУ громадські;
Кроки до відтворення:
- Встановіть свіжий ванільний дистрибутив Ubuntu 14.04 (я використовую Vagrant з цією коробкою Vagrant ).
- Встановіть PostgreSQL 9.3, налаштуйте так, щоб дозволити локальні з'єднання як "postgres" користувача PostgreSQL від будь-якого користувача Linux.
Створіть тестову базу даних. Я просто роблю:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Наберіть "довідка" для довідки. postgres = # створити базу даних mydb; СТВОРИТИ ДАНІ postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Наберіть "довідка" для довідки. mydb = # створити дані таблиці (вхід bigint); СТВОРИТИ СТІЛ mydb = # вставити у значення даних (1); ВСТАВКА 0 1 mydb = # вставити у значення даних (2); ВСТАВКА 0 1 mydb = # вставити у значення даних (3); ВСТАВКА 0 1 mydb = # \ q
Створіть резервну копію бази даних так:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
Видаліть кілька рядків із таблиці даних у mydb, щоб ми змогли сказати, чи вдало відновили дані.
Відновіть базу даних за допомогою:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Дані відновлюються, але команда pg_restore на етапі 6 виходить зі статусом 1
та показує такий вихід:
pg_restore: [архіватор (db)] Помилка під час обробки TOC: pg_restore: [архіватор (db)] Помилка під час запису TOC 5; 2615 2200 SCHEMA public postgres pg_restore: [архіватор (db)] не зміг виконати запит: ПОМИЛКА: схема "public" вже існує Командою були: СТВОРИТИ СХЕМУ громадські; ПОПЕРЕДЖЕННЯ: помилки ігноруються при відновленні: 1
Я не можу просто проігнорувати це, тому що я запускаю цю команду програмно і мені потрібно використовувати статус виходу, щоб визначити, не вдалося відновлення чи ні. Спочатку я замислювався, чи ця проблема не була, тому що я ставлю свою базу даних загальнодоступною (схема за замовчуванням). Я мотивував, що публікація буде створена в результаті --create
опції за допомогою pg_restore до відновлення даних (що, можливо, можна спробувати створити і цю схему, оскільки саме там знаходиться моя таблиця), але коли я спробував вищевказані кроки зі своєю таблицею в іншій схемі результати були однаковими, а повідомлення про помилки були однаковими.
Я щось роблю не так? Чому я бачу цю помилку?
--create
безclean
цього не виправляє проблему.