[[ Скрипт бэкапа для PostgreSQL ]]

PostgreSQL

Скрипт бэкапа для 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






Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
211 +1 = 
 
handmade/postgres/pg_backup.txt · Последнее изменение: 2025/04/05 18:28 — lexa
Gentoo Linux Gentoo Linux Driven by DokuWiki