Pull to refresh

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

Reading time2 min
Views5.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. Просто добавь воды в крон.
Tags:
Hubs:
+18
Comments14

Articles