Скрипт бэкапа для PostgreSQL
- Python >=3.9
- psql, pg_dumpall, pg_dump
Скрипт запускает pg_dump, pg_dumpall для дампа глобальных объектов (global objects - роли и табличные пространства) и всех БД.
Для авторизации используется переменная окружения PGPASSWORD или файл ~/.pgpass
Можно использовать формат directory-format (man pg_dump), что позволяет выполнять дамп в несколько потоков (njobs).
Сам скрипт размещен на GitHub
См. help по ключам запуска
./pg_backup.py --help
Пример запуска
PGPASSWORD=***** ./pg_backup.py -h localhost /backup
Для каждого запуска создается каталог вида:
2025.04.05_171126_tmp -> создается НА ВРЕМЯ РАБОТЫ, если процесс завершился, а каталог остался, то это значит скрипт был прерван, убит и т.п. часть данных в нем не валидна, но могут быть и успешные бэкапы. 2025.04.05_171126_good -> после успешного завершения каталог переименуется в good 2025.04.05_171126_error -> каталог переименуется в error, если во время выполнения произошли ошибки часть данных в нем не валидна, но могут быть и успешные бэкапы.
Настройка cron
Пример настройки автоматического запуска по cron и политики сохранения:
/etc/cron.d/pg_backup
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin PYTHONIOENCODING=utf8 MAILTO=root ### Backup 0 1 * * * postgres OUTPUT=$(pg_backup.py "/mnt/nfs.storage/backup/postgres" 2>&1) || echo "${OUTPUT}" ### Cleanup # Оставлять последние 5 каталогов с успешно завершенными бэкапами 0 9 * * * postgres find /mnt/nfs.storage/backup/postgres/ -maxdepth 1 -type d -name '????.??.??_??????_good' | sort -r | awk 'FNR>5 {print}' | xargs -r rm -rf # Оставлять 1 каталог с ошибками, но не старше 3 дней 1 9 * * * postgres find /mnt/nfs.storage/backup/postgres/ -maxdepth 1 -type d -name '????.??.??_??????_error' | sort -r | awk 'FNR>1 {print}' | xargs -r rm -rf 2 9 * * * postgres find /mnt/nfs.storage/backup/postgres/ -maxdepth 1 -type d -name '????.??.??_??????_error' -mtime +3 | xargs -r rm -rf # Удалять tmp каталоги старше 3 дней. Именно старые т.к. каталог создается во время работы скрипта 3 9 * * * postgres find /mnt/nfs.storage/backup/postgres/ -maxdepth 1 -type d -name '????.??.??_??????_tmp' -mtime +3 | xargs -r rm -rf
Обсуждение