чому pg_restore ігнорує - створювати? Помилка: не вдалося: FATAL: база даних «new_db» не існує


16

Я намагаюся запустити наступну команду:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

Я отримав:

failed: FATAL:  database "new_db" does not exist

Відповіді:


19

Це тому, що це так, як працює pg_restore.

Посібник pg_restore говорить наступним чином:

-C, --create Створити базу даних, перш ніж відновити її. Якщо --clean також вказано, скиньте та відтворіть цільову базу даних перед підключенням до неї.

Якщо використовується цей параметр, база даних з іменем -d використовується лише для видачі початкових команд DROP DATABASE та CREATE DATABASE . Усі дані відновлюються у назві бази даних, яка з’являється в архіві .

-D відновить у даній базі даних, якщо і лише якщо -C не використовується. Якщо використовується -C, база даних використовується як "запуск", а не як пункт призначення.


6
Для уточнення: немає способу створити довільне ім’я бази даних та відновити його pg_restore. Параметр -C може створити лише базу даних, ім'я якої відповідає імені бази даних у дамп-файлі. Щоб відновити довільну базу даних, перед запуском потрібно запустити CREATE DATABASE new_db;в psql pg_restore --dbname=new_db.
Люк

моє командуванняdocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma

5
Чому інструменти повинні бути заплутаними, коли вони можуть бути простими?
Августин Рідінгер

8

Коротше кажучи, ви хочете або (очистити існуючі): (зверніть увагу на ім'я бази даних postgres)

pg_restore -c -d postgres db.dump

або (створити новий)

pg_restore -C -d postgres db.dump

або (створити нове явно)

createdatabase the_database
pg_restore -d the_database db.dump

Дивіться, що сказала ШОС для більш детальної інформації.


Ваша перша пропозиція не спрацювала 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan

Я можу підтвердити, що це працює (після редагування та після виправлення неправильного написання "постгресів"). pg_restore -C -d postgres db.dumpможе виглядати страшно, але це нічого не робить для бази даних postgres, вона використовується лише для початкового з'єднання.
Зільк

0

Щоб бути більш чітким, саме це я і вирішив для мене:

  1. Створіть порожню базу даних з потрібним іменем: (у моєму випадку ім'я користувача було "postgres")

    psql -U [username]

Потім він запропонує ввести пароль. У цей момент ви увійдете в систему як [ім'я користувача]. Введіть наступне:

    CREATE DATABASE [dbname];

Тепер вийдіть із сеансу та поверніться до звичайного сеансу терміналу.

  1. Відновіть базу даних з файлу, у якому ви встановили цільове ім'я бази даних, як саме те ім'я бази даних, яке ви тільки що створили.

    cat [your_file_path/filename] | psql -U [username] [dbname]

Де [your_file_path / filename] - це розташування файлу db або текстового файлу, який ви хочете відновити.


Під час створення резервної копії за допомогою -Fопції de ви повинні використовувати pg_restore для відновлення резервної копії, якщо ви не використовуєте, -F pякий створює звичайний текстовий файл із sql пропозиціями.
EAmez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.