Резервное копирование и восстановление PostgreSQL
Содержание
Команды для резервного копирования и восстановления
Полная резервная копия всех баз данных со всеми пользователями и их правами:
pg_dumpall > savedfile.sql
Восстановление резервной копии всех баз данных со всеми пользователями и их правами:
psql postgres -f savedfile.sql
Резервная копия только одной базы данных:
pg_dump -d dname > savedfile.sql
Восстановление резервной копии только одной базы данных:
psql dbname -f savedfile.sql
Резервное копирование только одной или нескольких таблиц одной базы данных:
pg_dump -d dname -t table1 -t table2 -t table3 > savedfile.sql
Резервное копирование только пользователей:
pg_dumpall -g > users.sql
Резервное копирование и восстановление базы данных под другим владельцем:
pg_dump -d database --no-owner > savedfile.sql
psql -U newowner dbname -f savedfile.sql
Физическая резервная копия в каталог:
pg_basebackup -D /destination/path -Pv --checkpoint=fast
Восстановление физической резервной копии из каталога:
chown postgres:postgres -R /destination/path
chmod 700 -R /destination/path
Физическая резервная копия в tar-файлы:
pg_basebackup -D /destination/path -Pv --checkpoint=fast -F t
Будут сформированы файлы base.tar
и pg_wal.tar
Восстановление из физической резервной копии:
Распаковываем файл base.tar
в каталог с файлами баз данных, затем распаковываем файл pg_wal.tar
в подкаталог pg_wal
.
Физическая резервная копия в один сжатый tar-файл:
pg_basebackup -D /destination/path -Pv --checkpoint=fast -F t -X stream -z
Скрипт для периодического логического резервного копирования
Для автоматизации резервного копирования всех баз данных я написал скрипт pgbackup.sh. Скрипт формирует в каталоге для резервных копий файлы с именами вида dbname.YYYYmmdd.sql.bz2
, где dbname
- имя базы данных, YYYYmmdd
- текущая дата. Кроме резервных копий баз данных скрипт также формирует резервные копии файлов конфигурации /etc/postgresql/15/main/postgresql.conf
и /etc/postgresql/15/main/pg_hba.conf
. Резервные копии этих файлов сохраняются вместе с файлами резервных копий баз данных под именами postgresql.YYYYmmdd.conf
и pg_hba.YYYYmmdd.conf
. Дополнительно в файл global.YYYYmmdd.sql
выгружаются команды для создания пользователей. Также имеется возможность заливать только что сделанные резервные копии на удалённый сервер по SSH.
Настроить скрипт можно с помощью файла конфигурации /etc/pgbackup.conf
, пример которого приведён ниже:
BACKUPS_PATH=/backups/
DAYS=1
RUSER=archive
RSERVER=archive.server.tld
RPATH=/archive/postgresql.core/
RKEY=/root/.ssh/id_ed25519
Где:
BACKUP_PATH
- каталог для резервных копий баз данных,RUSER
- имя пользователя на удалённом сервере,RSERVER
- доменное имя или IP-адрес удалённого сервера, на который нужно скопировать архив с резервной копией,RPATH
- путь к файлу архива на удалённом сервере,RKEY
- путь к приватному ключу пользователя на удалённом сервере для подключения по SSH,DAYS
- сколько архивов с резервной копией необходимо сохранять локально.
Для включения периодического резервного копирования нужно выполнить команду редактирования списка периодических задач с помощью следующей команды:
# crontab -e
И добавить в список задач время запуска скрипта и путь к скрипту, в данном случае скрипт /usr/local/bin/pgbackup.sh
будет запускаться ежесуточно ровно в 4 часа утра:
20 4 * * * /usr/local/bin/pgbackup.sh
Описанный скрипт адаптирован для запуска на паре серверов, роли которых можно менять. При этом отправка резервных копий по SSH выполняется только при запуске скрипта на реплике.
Скрипт для периодического физического резервного копирования
Для автоматизации резервного копирования с помощью утилиты pg_basebackup
я написал скрипт pgbasebackup.sh. Для его работы понадобится установить в систему пакет с утилитой pigz
для сжатия архива в несколько параллельных потоков:
# apt-get install pigz
Настроить скрипт можно с помощью файла конфигурации /etc/pgbasebackup.conf
, пример которого приведён ниже:
BACKUP_PATH=/backup/
PIGZ_OPTIONS="-p8"
RUSER=archive
RSERVER=archive.server.tld
RPATH=/archive/postgresql.core.tgz
RKEY=/var/lib/postgresql/.ssh/id_ed25519
DAYS=0
Как можно заметить, настройки практически полностью совпадают с настройками скрипта для логического резервного копирования. По сравнению с ним, в этом файле конфигурации появилась только одна новая опция:
PIGZ_OPTIONS
- опции командной строки для утилиты сжатияpigz
.
Внутри каталога, заданного переменной BACKUP_PATH
, создаётся подкаталог db
с резервной копией базы данных. Архив с резервной копией отправляется на удалённый сервер только если определены все четыре опции RSERVER
, RPATH
, RUSER
, RKEY
и только с сервера-реплики.
Опция DAYS
используется только в том случае, если архив с резервной копией не отправляется на удалённый сервер. В этом случае в каталоге BACKUP_PATH
поддерживается указанное в переменной количество архивов с содержимым каталога db
, имеющих имена вида db_YYYYMMDD.tbz
, где символы YYYY
соответствуют году, MM
- номеру месяца, DD
- числу месяца создания архива. Впрочем, логику работы скрипта можно поменять, отредактировав его.