Для резервного копирования PostgreSQL вы можете использовать:
- Дампы SQL (pg_dump и pg_dumpall)
- Копирование файлов PostgreSQL
- Непрерывное архивирование (pg_basebackup и WAL файлы)
Резервное копирование PostgreSQL с помощью SQL дампов
Вы можете использовать утилиту pg_dump для получения SQK дампа любой базы и экспорта ее в файл:
pg_dump mytestdb -f /backup/mytestdb.dump
Можно Вы можете сразу сжать файла дампа с помощью gzip.
pg_dump -U postgres mytestdb | gzip > /backup/mytestdb.gz
Преимущество такого способа резервного копирования:
- База данных не блокируется
- Резервное копирование не зависит от версии SQL или Linux
- Вы можете отредактировать файл дампа
Однако резервное копирование больших баз данных PostgreSQL через pg_dump можете занять длительное время.
Если вы хотите восстановить базу PostgreSQL из дампа, сначала нужно ее создать. Чтобы создать новую базу данных, выполните:
psql -> CREATE DATABASE <имя базы данных>;
sudo -u postgres psql -U postgres -c \
"CREATE DATABASE mynewdb"
Чтобы восстановить данные из дампа в новую базу:
psql mynewdb < /backup/mytestdb.dump
Чтобы выполнить восстановление базы в транзакции, добавьте параметр -1:
psql -1 mynewdb < /backup/mytestdb.dump
Резервное копирование файлов PostgreSQL
Чтобы скопировать файлы PostrgreSQL, сначала нужно остановить службу PostgreSQL:
# systemctl stop postgresql.service
# tar -cjf /backup/mypsql.tar.gz /usr/local/pgsql/data
# systemctl start postgresql.service
В этом случае скорость резервного копирования PostrgreSQL будет в несколько раз выше, чем при использовании pg_dump.
Однако:
- Придется остановить службу PostgreSQL
- Пути зависят от версии PostgreSQL и операционной системы
- Вы не можете выбрать базу данных, которую нужно забекапить (в архиве будут все базы)
Чтобы восстановить PostgreSQL из такого бэкапа, достаточно остановить PostgreSQL, очистить каталог data, и распаковать архив с помощью:
# tar -xf /backup/mypsql.tar.gz
Непрерывное архивирование в PostgreSQL
PostgreSQL создает файлы журнала WAL (Write Ahead Log) при записи данных. Вы можете создать резервную копию через pg_basebackup и затем периодически архивировать файлы WAL.
Для использования непрерывной архивации нужно внести следующие настройки в конфигурационный файл postgresql.conf:
wal_level = replica archive_mode = on archive_command = 'test ! -f /mnt/archivedir/%f && cp %p /mnt/archivedir/%f'
Перезапустите Postgresql:
# systemctl restart postgresql.service
Создайте базовый бэкап:
# pg_basebackup -D p /mnt/archivedir -Ft –z