Загрузка дампа в БД

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску

Восстановление в новую базу:

createdb \
  -h IP_SERV_POSTGR \
  -p 5432 \
  -U postgres \
  -T template0 \
  NAME_BD_test

template0 создаёт действительно чистую базу без дополнительных объектов из template1

pg_restore \
  -h IP_SERV_POSTGR \
  -p 5432 \
  -U postgres \
  -d NAME_BD_test \
  --no-owner \
  --no-privileges \
  --exit-on-error \
  --single-transaction \
  "/PATH_DUMP/NAME_FILE_DUMP.dump"

Назначение параметров:

  • --no-owner не пытается назначить владельцев с исходного сервера;
  • --no-privileges не восстанавливает права старых ролей;
  • --exit-on-error прекращает работу при первой ошибке;
  • --single-transaction откатывает восстановление целиком при ошибке.

После этого права прикладному пользователю нужно выдать заново.

Дамп отдельных таблиц

Команда с -t синтаксически правильная, но описание неполное. Выбор отдельных таблиц не гарантирует включение всех зависимостей:

  • пользовательских типов;
  • функций;
  • связанных таблиц;
  • внешних ключей;
  • необходимых последовательностей и других объектов.

Для переноса всей прикладной схемы надёжнее:

pg_dump \
  -h IP_SERV_POSTGR \
  -p 5432 \
  -U postgres \
  -d NAME_BD \
  -Fc \
  --no-owner \
  --no-privileges \
  -n main \
  -f "/PATH_DUMP/main.dump"

Безопасность

Дамп содержит персональные и медицинские данные. Желательно добавить:

chmod 700 ~/postgre/dump
chmod 600 "/PATH_DUMP/NAME_FILE_DUMP.dump"

Также лучше:

  • не использовать postgres для регулярного резервного копирования;
  • создать отдельную роль только для резервного копирования;
  • шифровать дамп при хранении и передаче;
  • рассчитывать контрольную сумму:
sha256sum "/PATH_DUMP/NAME_FILE_DUMP.dump" \
  > "/PATH_DUMP/NAME_FILE_DUMP.dump.sha256"

Главная проверка резервной копии заключается не в pg_restore --list, а в периодическом тестовом восстановлении в отдельную базу и проверке данных. --list подтверждает только то, что каталог архива читается.

После восстановления проверить подключение:

psql \
  -h IP_SERV_POSTGR \
  -p 5432 \
  -U postgres \
  -d NAME_BD_test \
  -c "SELECT current_database(), version();"