Так получилось, что мне было необходимо настроить резервное копирование баз данных MySQL и PostgreSQL. Хотелось вполне определенного, а именно:
Общий алгоритм скриптов таков, что выбирается список баз данных, и по нему сохраняются архивы. Устаревшие удаляются. В скриптах имеется возможность и необходимость настройки: указание количества копий архива для ротации, логин/пароль для СУБД и папка для хранения результатов работы.
MySQL:
С PostgreSQL я долго возился по причине того, что никак не мог передать пароль, но решение нашлось.
PostgreSQL:
Эти замечательные скрипты давно и успешно работают на машинке под управлением Debian. Просто добавьводы в крон.
- Простота решения
- Каждая БД в отдельном файле
- Имя в формате «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. Просто добавь