Skip to main content

Postgres database dump and restore

В этой короткой инструкции описывается как сделать бэкап базы данных PostgreSQL и восстановить его (на другом сервере);

Предполагается что PostgreSQL развёрнута в docker контейнере.

Dump

! Осторожно, если для докер-контейнера с БД не настроен volume который сохраняет состояние базы данных при перезапуске контейнера, то есть шанс потерять всё. (Но надюсь он настроен, потому что иначе жить нельзя).

Для начала добавьте в docker-compose.yml в раздел volumes новый volume чтобы было удобно забрать с сервера дамп базы данных.

  volumes:
    - ./dumps/:/dumps/

Преезапустите контейнер:

docker compose down
docker compose up -d

Войдите внутрь контейнера с помощью команды (Выйти из контейнера: ctrl+d):

docker exec -it postgres_db bash

Сделайте дамп вашей базы данных

pg_dump database_name > dumps/db.sql

Перенос

Старый сервер. Файл будет создан в примонтированной директории dumps. Перенос файла дампа на новый сервер можно выполнить любым удобным способом, scp или winSCP (GUI для scp).

Новый сервер. Проделайте те же действия с docker-compose.yml для создания volume и перезапустите контейнер. В директории рядом с docker-compose.yml должна создастся папка dumps. Перенесите файл дампа туда.

Restore

Войдите внутрь контейнера с помощью команды (Выйти из контейнера: ctrl+d):

docker exec -it postgres_db bash

Тут существует два варианта.

  • Вариант 1. Если база данных чистая, то выполните команду:
    psql -d database_name < dumps/db.sql
    
  • Вариант 2. Если база данных не чистая или вы сделали что-то не так и psql не даёт восстановить из дампа. Самый простой способ дропнуть базу и создать её заного.
    psql -c "DROP DATABASE database_name;"
    psql -c "CREATE DATABASE database_name;"
    
    После чего загрузите базу данных из дампа:
    psql -d database_name < dumps/db.sql
    

Поздравляю, вы великолепны!