Как стать автором
Обновить

Не можешь найти то, что нужно? Сделай сам

Время на прочтение2 мин
Количество просмотров5.3K
Так получилось, что мне было необходимо настроить резервное копирование баз данных MySQL и PostgreSQL. Хотелось вполне определенного, а именно:
  • Простота решения
  • Каждая БД в отдельном файле
  • Имя в формате «bdname.YYYY-MM-DD-HH:mm:ss.sql.gz»
  • Для каждой БД хранится определенное число архивов
  • Набор архивов БД находится в ротации
  • Решение определенных проблем с указанием пароля для pg_dump
  • и т.п.
Готовых скриптов я в сети не нашел, но подобрал и объединил несколько решений, получив искомое.

Общий алгоритм скриптов таков, что выбирается список баз данных, и по нему сохраняются архивы. Устаревшие удаляются. В скриптах имеется возможность и необходимость настройки: указание количества копий архива для ротации, логин/пароль для СУБД и папка для хранения результатов работы.

MySQL:
#!/bin/bash

# user & password
USER=root
PASS=pass

# number of backups to be saved
KEEP=14

# dir to backup
DIR=/var/backups/mysql

NOW=$(date +"%Y-%m-%d")
DBS="$(mysql -u $USER -p$PASS -Bse 'show databases')"

for db in $DBS
do

  BACKUPS=`find $DIR -name "$db.*.gz" | wc -l | sed 's/\ //g'`
  while [ $BACKUPS -ge $KEEP ]
  do
    ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
    BACKUPS=`expr $BACKUPS - 1`
  done
  
  FILE=$DIR/$db.$NOW-$(date +"%T").sql.gz
  mysqldump -u $USER -p$PASS $db | gzip -9 > $FILE

done

exit 0


* This source code was highlighted with Source Code Highlighter.

С PostgreSQL я долго возился по причине того, что никак не мог передать пароль, но решение нашлось.

PostgreSQL:
#!/bin/bash

# user & password
USER=postgres
PASS=pass

# number of backups to be saved
KEEP=14

# dir to backup
DIR=/var/backups/pgsql

PGPASSWORD=$PASS
export PGPASSWORD

NOW=$(date +"%Y-%m-%d")
DBS="$(psql -U $USER -lt |awk '{ print $1}' |grep -vE '^-|^List|^Name|template[0|1]')"

for db in $DBS
do

  BACKUPS=`find $DIR -name "$db.*.gz" | wc -l | sed 's/\ //g'`
  while [ $BACKUPS -ge $KEEP ]
  do
    ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
    BACKUPS=`expr $BACKUPS - 1`
  done
  
  FILE=$DIR/$db.$NOW-$(date +"%T").sql.gz

  pg_dump -U $USER $db | gzip -c > $FILE

done

PGPASSWORD=
export PGPASSWORD

exit 0


* This source code was highlighted with Source Code Highlighter.

Эти замечательные скрипты давно и успешно работают на машинке под управлением Debian. Просто добавь воды в крон.
Теги:
Хабы:
Всего голосов 42: ↑30 и ↓12+18
Комментарии14

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань