Резервные копии PostgreSQL по расписанию и проверка восстановления
Бэкап, из которого ни разу не пробовали восстановиться, — это скорее надежда, чем бэкап. Ниже минимальная схема для небольшой базы: ежедневная копия, хранение за две недели и регулярная проверка.
Скрипт копирования
#!/bin/sh
set -e
DIR=/var/backups/postgres
mkdir -p "$DIR"
pg_dump -U postgres -Fc mydb > "$DIR/mydb-$(date +%F).dump"
find "$DIR" -name 'mydb-*.dump' -mtime +14 -delete
Формат -Fc сжатый и позволяет потом восстанавливать отдельные таблицы через pg_restore.
Расписание
Самый простой вариант — cron от пользователя postgres:
30 3 * * * /usr/local/bin/pg-backup.sh
Проверка восстановления
Раз в неделю поднимаю последнюю копию во временную базу и проверяю, что данные на месте:
createdb -U postgres restore_test
pg_restore -U postgres -d restore_test "$(ls -t /var/backups/postgres/*.dump | head -1)"
psql -U postgres -d restore_test -c "select count(*) from users;"
dropdb -U postgres restore_test
Копии не должны жить на том же сервере
Если сервер выйдет из строя целиком, локальные копии пропадут вместе с ним. Минимум — раз в сутки отправлять последний файл на другой хост или в объектное хранилище.
← Ко всем заметкам