TGViewer
ServerAdmin.ru ServerAdmin.ru @srv_admin · 32.6K subscribers
Post #4827 8.48K
Утром рассказал, как делаю бэкапы баз Postgresql с помощью скриптов и pg_dump. Сейчас покажу, как я их проверяю. Для этого обычно держу небольшой тестовый сервер с той же версией Postgresql. В идеале это должна быть копия прода, но не всегда это возможно. На нём же зачастую проверяю обновления.

Первым делом надо забрать дампы с исходного сервера. Для этого беру простой скрипт, который забирает по SSH только свежие файлы за прошлый день. Если забрать сразу только нужные файлы, то потом не придётся делать в них выборку:

#!/bin/bash

/usr/bin/rsync -av --progress --files-from=<(ssh root@10.20.5.10 '/usr/bin/find /var/lib/pgpro/backup -type f -mtime -1 -exec basename {} \; | egrep -v timestamp') root@10.20.5.10:/var/lib/pgpro/backup/ /data/backup/


Использую rsync, а список файлов для копирования формирую сразу в выражении ключа, подключившись к нужному хосту по SSH и отсортировав файлы по дате, взяв не старше суток. В данном случае файл timestamp через egrep -v добавлен в исключения. У меня там метка времени последнего бэкапа хранится для нужд мониторинга.

Ну а дальше дело техники. По очереди выполняю набор команд для удаления старой базы, создания новой, распаковки и заливки дампа. Перед первым запуском этого скрипта вручную создаю все восстанавливаемые базы и выборочно проверяю восстановление. Потом формирую итоговый список команд:

#!/bin/bash

BASES=`/opt/pgpro/1c-16/bin/psql -U postgres -l | grep "_buh\|_zup" | awk '{print $1}'`
BACKUP_DIR="/data/backup"

for i in ${BASES};
  do
   echo "`date +"%Y-%m-%d_%H-%M-%S"` Drop database ${i}"
   /opt/pgpro/1c-16/bin/dropdb -U postgres ${i}
   echo "`date +"%Y-%m-%d_%H-%M-%S"` Create database ${i}"
   /opt/pgpro/1c-16/bin/createdb -U postgres -T template0 ${i}
   echo "`date +"%Y-%m-%d_%H-%M-%S"` Start extract $i"
   /usr/bin/find /data/backup -type f -name *${i}* -exec /usr/bin/unpigz '{}' \;
   echo "`date +"%Y-%m-%d_%H-%M-%S"` End extract $i"
   echo "`date +"%Y-%m-%d_%H-%M-%S"` Start restore $i"
   /opt/pgpro/1c-16/bin/psql -U postgres ${i} < ${BACKUP_DIR}/`ls ${BACKUP_DIR} | grep ${i}` 1>/dev/null
   echo "`date +"%Y-%m-%d_%H-%M-%S"` End restore $i"
   echo "`date +"%Y-%m-%d_%H-%M-%S"` rm dump ${i}"
   /usr/bin/rm ${BACKUP_DIR}/`ls ${BACKUP_DIR} | grep ${i}`
done


Сразу говорю, что я тут ничего не оптимизировал, никаких проверок не делал. Если просто взять и запустить, то скорее всего у вас вывалятся какие-то ошибки или что-то пойдёт не так. Я просто показываю идею. У меня уже давно и структура каталогов одна и та же, и подход к именованию баз, бэкапов и т.д. Это всё сделано под меня и работает так уже много лет. Меня устраивает.

В данном скрипте нет никаких проверок успешной работы и оповещений, потому что это не последний этап проверок. Далее в зависимости от того, где эта база используется, запускаются свои проверки. Для баз 1С выполняется автоматическая выгрузка в dt с помощью отдельного скрипта. Если она проходит успешно, то считается, что дамп базы живой и нормально восстановился.

Если же это база от веб проекта, то параллельно из другого бэкапа восстанавливаются исходники в тестовый веб сервер, подключается восстановленная база и работает стандартная веб проверка в Zabbix Server, которая ищет какие-то данные на странице, которые без работающей базы не будут показаны. Если веб проверки проходят успешно, то считается, что база восстановилась, да и в целом бэкап живой.

Более сложные проверки в восстановленных базах я не делаю. Мой опыт в обслуживаемых инфраструктурах показывает, что этого достаточно. Ни разу не сталкивался, что всё прошло успешно, а с базой проблемы. Обычно проблемы возникают сразу в снятии дампа. Если он корректно выполнен, то дальше уже все отрабатывает нормально.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#backup #postgresql #script
Telegram ServerAdmin.ru Раз уж я рассмотрел панели для управления бэкапами (Postgresus и Pgbackweb) в виде дампов в Postgresql, было бы логично рассмотреть и вариант со своими велосипедами на bash. Поделюсь тем, что использую я. Сначала полный текст скрипта для бэкапа: #!/bin/bash…
  • 👍 111
  • 👎 4
More from @srv_admin
  1. Sep 25, 2026▶️ Очередная подборка авторских IT роликов, которые я лично посмотрел и посчитал интересны…
  2. Sep 25, 2026Девопсы, сисадмины, архитекторы, техлиды (и вообще все, кто принимает технические или бизн…
  3. Sep 25, 2026Подписчик поделился полезным проектом - Webtop. Это Linux дистрибутив с графикой, упакован…
  4. Sep 24, 2026Траблшутинг - мастхэв компетенция для инженера В Rebrain траблшутинги проводят уже несколь…
  5. Sep 23, 2026Очередная подборка статей авторов, которые согласились в ней участвовать. Кто не понимает,…
  6. Sep 23, 2026Контейнеры в одном инструменте, виртуалки — в другом, частное облако — вообще отдельная ис…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →