Восстановить базу данных из pg_dump

У меня была непустая БД, и я сделал ее резервную копию:

pg_dump myBase > backup.sql

Затем я должен удалить БД, и теперь я пытаюсь восстановить ее из backup.sql. Итак, сначала я создаю базу данных:

create database myBase

предоставить привилегии от psql

grant all privileges on database "myBase" to myUser

а затем попытаться восстановиться из pg_dump с помощью:

pg_dump myBase < backup.sql

И у меня не было никаких ошибок, но когда я проверяю таблицы по \dt, они совершенно пусты. Я также пытался восстановить с помощью:

psql -h localhost -d myBase-U myUser-f backup.sql (ошибки нет, но и таблиц тоже нет)

psql myBase < backup.sql (как выше)

У меня есть небольшой опыт работы с dbs, поэтому я предполагаю, что это должно быть что-то очевидное для более опытного пользователя.


person Piotr Wójcik    schedule 05.07.2017    source источник
comment
как вы проверяете, что dp пуст? psql myBase -c "\dt"?..   -  person Vao Tsun    schedule 05.07.2017
comment
\dt показывает таблицы в БД, и я не нашел отношений   -  person Piotr Wójcik    schedule 05.07.2017
comment
так что, прежде чем удалить базу данных, у вас есть список, и после восстановления той же команды не будет найдено отношений?..   -  person Vao Tsun    schedule 05.07.2017
comment
Да, перед удалением \dt показывает список таблиц, а после восстановления отношений не нашел.   -  person Piotr Wójcik    schedule 05.07.2017
comment
не могу воспроизвести. см. ответ. без понятия, почему у вас нет ошибок и нет отношений. Я имею в виду много возможных точек отказа, но не вижу, как угадать   -  person Vao Tsun    schedule 05.07.2017
comment
заполняется ли backup.sql ожидаемыми таблицами/данными?   -  person JGH    schedule 05.07.2017
comment
@JGH В нем около 1500 строк, поэтому я не уверен на 100%, что все в порядке, но я проверяю пару мест и все в порядке с моими таблицами, столбцами и данными. Но я не использовал никакого валидатора, есть ли он?   -  person Piotr Wójcik    schedule 05.07.2017
comment
на всякий случай psql -h localhost -d myBase-U myUser -f backup.sql -X ничего не меняет?..   -  person Vao Tsun    schedule 05.07.2017
comment
нет, это не так   -  person Piotr Wójcik    schedule 05.07.2017


Ответы (2)


Не удается воспроизвести проблему:

postgres=# create database so;
CREATE DATABASE
postgres=# \c so
You are now connected to database "so" as user "postgres".
so=# create table so(i int);
CREATE TABLE
so=# insert into so values (1);
INSERT 0 1
so=# \! pg_dump so > /tmp/so.sql
so=# \c postgres
You are now connected to database "postgres" as user "postgres".
postgres=# drop database so;
DROP DATABASE
postgres=# create database so;
CREATE DATABASE
postgres=# \c so
You are now connected to database "so" as user "postgres".
so=# \dt
No relations found.
so=# \! psql so -f /tmp/so.sql
SET
SET
SET
SET
SET
SET
CREATE EXTENSION
COMMENT
SET
SET
SET
CREATE TABLE
ALTER TABLE
REVOKE
REVOKE
GRANT
GRANT
so=# \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | so   | table | postgres
(1 row)
person Vao Tsun    schedule 05.07.2017
comment
Я следую вашим инструкциям и примеру для работы SO без проблем, но мой случай все еще не работает. Я вижу разницу в восстановлении строки db -f /tmp/so.sql. Ваш пример выдает пару строчек того, что сейчас происходит, а мой ни одной. Может у меня дамп битый? - person Piotr Wójcik; 05.07.2017
comment
если у вас есть ошибка в операторах, это выдаст ошибку на стандартный вывод... конечно, вы можете добавить \o some_file в первую строку сценария sql, а затем psql отправит весь вывод в какой-то_файл, но вы сказали, что не изменяли его?.. ни ты не использовал переключатель -o - верно?.. - person Vao Tsun; 05.07.2017
comment
Кстати, дамп нельзя сломать. Он работает в Windows. Я создаю новую базу данных, пользователя, предоставляю привилегии, восстанавливаю данные, и локально он работает. Так что на линуксе почему-то не работает. - person Piotr Wójcik; 05.07.2017

Получил ту же проблему, нашел решение здесь: ">Невозможно восстановить базу данных psql из pg_dump под другим именем пользователя

pg_dump имя_базы_данных -O -x > имя_резервной копии.sql

-O ‹-- Нет владельца Не выводить команды для установки прав собственности на объекты в соответствии с исходной базой данных

-x ‹-- Нет привилегий Предотвратить сброс привилегий доступа (команды предоставления/отзыва)

person fierytermite    schedule 17.12.2018