Назад | Перейти на главную страницу

pg_restore без ключа -d: что он делает?

версии: postgresql 9.6, macos 10.14

Как postgres пользователь, я выполнил команду pg_restore:

pg_restore -C backup.curated.20190901.0.bup

т.е. создать базу данных в соответствии с тем, что находится в файле дампа.

Кажется, это работает нормально, он высветил кучу команд sql на экране.

Но ... база данных не создана.

Чтобы действительно создать его, мне пришлось изменить команду, чтобы добавить -d указать базу данных.

pg_restore -d postgres -C backup.curated.20190901.0.bup

Такое же поведение, за исключением того, что на этот раз база данных восстановлена.

Из pg_restore doc

-C --создать

Create the database before restoring into it. If --clean is also specified, drop and recreate the target database before connecting to it.

When this option is used, the database named with -d is used only to issue the initial DROP DATABASE and CREATE DATABASE commands. All data is restored into the database name that appears in the archive.

В принципе, мне любопытно, почему отсутствие -d Switch не жалуется, если это необходимо для восстановления БД.

Что это pg_restore делать здесь? Предварительный просмотр пробного прогона?

Если это актуально, я использовал команду дампа:

sudo -u postgres $pgbin/pg_dump -o -Fc $dbname > $dirbackup/$dbname.bup;

В принципе, мне любопытно, почему не жалуются на отсутствие ключа -d, если это необходимо для восстановления базы данных.

Что здесь делает pg_restore? Предварительный просмотр пробного прогона?

Он выводит сценарий, не предполагая, что вы хотите с ним делать. Предварительный просмотр, конечно, но также и подключение к psql, или в ssh чтобы воспроизвести его на удаленном экземпляре, к которому вы не можете напрямую подключиться, или просто сохраните его в файл, чтобы отредактировать или перенести в другое место.

В последней версии PostgreSQL (12.0, выпущенной 3 октября 2019 г.) было подсчитано, что слишком много людей были удивлены, как и вы: pg_restore иду на стандартный вывод по умолчанию, поэтому, начиная с этого выпуска, нам нужно указать -f - аргумент, чтобы получить такое поведение. Первый вызов, о котором вы упомянули, не работает:

pg_restore: error: one of -d/--dbname and -f/--file must be specified

Флаги, необходимые с pg_restore зависят от обоих:

  • текущее состояние базы данных / сервера перед началом восстановления
  • на флагах, используемых для создания резервной копии одной базы данных с gd_dump
  • на флагах, используемых для создания полной резервной копии сервера с pg_dumpall

и последняя причина pg_restore -C не требует обязательного (разового) -d <database name> зависимости, файл резервной копии может содержать резервные копии более чем одной базы данных, и в этом случае имена этих баз данных будут включены в файл резервной копии.