Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение2 мин
Количество просмотров5.4K
Так получилось, что мне было необходимо настроить резервное копирование баз данных 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

Публикации

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