Как получить работающее и полное резервное копирование и тестирование базы данных PostgreSQL

45

Я надеялся, что смогу получить четкий ответ о том, как обеспечить полное резервное копирование Postgres, как если бы вы использовали MS SQL Server, а затем позаботиться об осиротевших пользователях.

Из того, что я прочитал, и это может быть неправильно, найти хороший блог PostgreSQL было непросто, поэтому, пожалуйста, не стесняйтесь рекомендовать его мне, мне нужно выяснить, как работает это приложение, чтобы я мог доверять своим резервным копиям и Slony. репликация. У меня был разработчик, который восстановил резервную копию, которую я взял из PgadminIII через custom, directoryи tarотформатировал при выборе OIDs, но он сказал, что два из них не загружались, tarа только каталог, а не данные. Я действительно смущен сейчас.

  1. Я использую PGAdminIII, у него есть pg_dumpи pg_dumpallопция. Я хочу сделать резервную копию всего , что мне нужно, чтобы проверить, восстановить базу данных где-нибудь и убедиться, что да, все данные, которые нам нужны, и наше резервное копирование в порядке. В конце концов я хочу написать сценарий авто-восстановления, но один день за один раз.

pg_dumpallпо-видимому, есть -globalsопция, которая должна делать резервные копии всего, но справка для pg_dumpallпоказывает, а -g, --globals-only dump only global objects, no databasesне --globalsопция.

Я думал, pg_dumpallчто по крайней мере резервное копирование внешних ключей, но даже это, кажется, «вариант». Согласно документации , даже несмотря на то, что pg_dumpallмне нужно использовать -oопцию для резервного копирования внешних ключей, я не могу себе представить, когда не захочу делать резервные копии внешних ключей, и это было бы более целесообразно в качестве параметров по умолчанию.

  1. Как бы я позаботился об осиротевших пользователях и подтвердил, что у меня есть все? Я бы хотел восстановить файл резервной копии на другом сервере и убедиться, что все работает. Если у кого-нибудь есть какие-либо предложения о том, как сделать реальное резервное копирование в PostgreSQL и восстановить его, я был бы очень признателен.

У меня был сервер PostgreSQL, но я до сих пор не могу понять, почему приложение не будет делать резервные копии OIDпо умолчанию! Кажется, что 99,9% времени вы хотели бы этого.

ОБНОВЛЕНИЕ 1:

В документации Postgres упоминается, что globalsвариант, который я искал, кажется, вариант по умолчанию в этой версии, но он все еще нуждается в этом -o. Если кто-то может проверить или дать мне пример команды для восстановления одной базы данных в другом месте со всем необходимым, я был бы благодарен.

Изменить: когда меня попросили показать уникальность этого вопроса, отредактировав мой вопрос. Этот вопрос поднимает проблему и дает ясность в отношении OID в резервных копиях, различий между глобальными и неглобальными значениями, а также в тестировании восстанавливает рекомендации, чтобы обеспечить хорошее резервное копирование, а не просто резервное копирование. Благодаря ответам я смог выполнить резервное копирование, выяснить глобальные переменные / oids и начал тестовое восстановление ночью на Postgres, используя задания cron. Спасибо за помощь!

Али Разеги
источник

Ответы:

58

Вы можете сбросить весь кластер PostgreSQL с помощью pg_dumpall. Это все базы данных и все глобальные переменные для одного кластера. Из командной строки на сервере я бы сделал что-то вроде этого. (Mine прослушивает порт 5433, а не порт по умолчанию.) Вам может потребоваться или не потребоваться опция --clean.

$ pg_dumpall -U postgres -h localhost -p 5433 --clean --file=dump.sql

Сюда входят глобальные переменные - информация о пользователях и группах, табличные пространства и т. Д.

Если бы я собирался сделать резервную копию одной базы данных и перенести ее на рабочий сервер , я бы сделал дамп базы данных с помощью pg_dump и выгрузил глобальные переменные либо

  • pg_dumpall --globals-only, или
  • pg_dumpall --roles-only (если вам нужны только роли)

так.

$ pg_dump -U postgres -h localhost -p 5433 --clean --file=sandbox.sql sandbox
$ pg_dumpall -U postgres -h localhost -p 5433 --clean --globals-only --file=globals.sql

Выходы - это просто текстовые файлы.

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

$ psql -U postgres -h localhost -p 5433 < globals.sql
$ psql -U postgres -h localhost -p 5433 < sandbox.sql

Я думал, что pg_dumpall, по крайней мере, сохранит резервные копии внешних ключей, но даже это кажется «опцией». Согласно: http://www.postgresql.org/docs/9.1/static/app-pg-dumpall.html даже с pg_dumpall, мне нужно использовать опцию -o для резервного копирования внешних ключей

Нет, эта ссылка говорит: «Используйте эту опцию, если ваше приложение каким-либо образом ссылается на столбцы OID (например, в ограничении внешнего ключа). В противном случае эту опцию использовать не следует». (Акцент добавлен.) Думаю, маловероятно, что ваше приложение ссылается на столбцы OID. Вам не нужно использовать эту опцию для «резервного копирования внешних ключей». (Прочтите файл дампа в вашем редакторе или в программе просмотра файлов.)

Майк Шеррилл 'Cat Recall'
источник
3
Не отсутствует ли имя базы данных в строке, куда импортируется sandbox.sql? psql -U postgres -h localhost -p 5433 sandbox < sandbox.sql
SebK
Он видит, что pg_dumpallверсия 9.5 неправильно работает со NULLзначениями при использовании COPY. Я получаю много ошибок, как это: psql:/tmp/dumpall.sql:4133559: invalid command \N psql:/tmp/dumpall.sql:4133560: invalid command \.При импорте обратно в Postgres 10 с использованиемpsql -f /tmp/dumpall.sql
piotrekkr