Я использую pg_dump / pg_restore для резервного копирования и восстановления базы данных PostgreSQL, но получаю некоторые сообщения об ошибках (и ненулевой статус выхода) из pg_restore. Я попробовал очень простой базовый вариант (обрисованный в общих чертах ниже), но все еще получил эти ошибки:
pg_restore: [archiver (db)] Ошибка при обработке текста: pg_restore: [archiver (db)] Ошибка записи TOC 5; 2615 2200 SCHEMA публичные постгрес pg_restore: [archiver (db)] не смог выполнить запрос: ОШИБКА: схема "public" уже существует Команда была: СОЗДАТЬ СХЕМУ ПУБЛИЧНОЙ;
Действия по воспроизведению:
- Установите свежий, ванильный дистрибутив Ubuntu 14.04 (я использую Vagrant с этой коробкой Vagrant ).
- Установите PostgreSQL 9.3, сконфигурируйте так, чтобы локальные подключения были разрешены как пользователь PostgreSQL «postgres» от любого пользователя 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: [archiver (db)] Ошибка при обработке текста: pg_restore: [archiver (db)] Ошибка записи TOC 5; 2615 2200 SCHEMA публичные постгрес pg_restore: [archiver (db)] не смог выполнить запрос: ОШИБКА: схема "public" уже существует Команда была: СОЗДАТЬ СХЕМУ ПУБЛИЧНОЙ; ВНИМАНИЕ: при восстановлении ошибки игнорируются: 1
Я не могу просто проигнорировать это, потому что я запускаю эту команду программно и мне нужно использовать состояние выхода, чтобы определить, было ли восстановление неудачным или нет. Первоначально я задавался вопросом, была ли эта проблема, потому что я сделал свою базу данных общедоступной (схема по умолчанию). Я рассуждал, что public будет создан в результате --create
опции pg_restore до восстановления данных (что, возможно, может попытаться создать и эту схему, поскольку именно там находится моя таблица), но когда я попытался выполнить описанные выше шаги с моей таблицей в другой схеме результаты были одинаковыми, а сообщения об ошибках были идентичными.
Я делаю что-то неправильно? Почему я вижу эту ошибку?
источник
--create
безclean
не решает проблему.В моем случае причина была в том, что я использовал
pg_restore
версию 11.2 postgresql-contrib для восстановления дампа, сделанногоpg_dump
9.6, в кластер PostgreSQL 9.6.После того, как я понизил мою
pg_restore
спину до 9.6, этаschema "public" already exists
ошибка исчезла, и процесс восстановления работал как прежде.источник